Spec-Zone.ru › Angular

ApplicationRef

Ссылка на приложение Angular, работающее на странице.

API

class ApplicationRef {
  readonly destroyed: boolean;
  readonly componentTypes: Type<any>[];
  readonly components: ComponentRef<any>[];
  readonly isStable: Observable<boolean>;
  whenStable(): Promise<void>;
  readonly injector: EnvironmentInjector;
  bootstrap<C>(component: Type<C>, options?: { hostElement?: string | Element | undefined; directives?: (Type<unknown> | DirectiveWithBindings<unknown>)[] | undefined; bindings?: Binding[] | undefined; } | undefined): ComponentRef<C>;
  bootstrap<C>(component: Type<C>, hostElement?: string | Element | undefined): ComponentRef<C>;
  tick(): void;
  attachView(viewRef: ViewRef): void;
  detachView(viewRef: ViewRef): void;
  onDestroy(callback: () => void): VoidFunction;
  destroy(): void;
  readonly viewCount: number;
}

destroyed

boolean

Указывает, был ли уничтожен этот экземпляр.

componentTypes

Type<any>[]

Возвращает список типов компонентов, зарегистрированных в этом приложении. Этот список заполняется ещё до создания компонента.

components

ComponentRef<any>[]

Возвращает список компонентов, зарегистрированных в этом приложении.

isStable

Observable<boolean>

Возвращает Observable, который указывает, стабильно или нестабильно приложение.

whenStable

Promise<void>
@returnsPromise<void>

Promise, который разрешается, когда приложение становится стабильным

injector

EnvironmentInjector

EnvironmentInjector, используемый для создания этого приложения.

bootstrap

2 перегрузки

Инициализирует компонент на элементе, найденном по его селектору, или, при необходимости, на указанном элементе.

@paramcomponentType<C>
@paramoptions{ hostElement?: string | Element | undefined; directives?: (Type<unknown> | DirectiveWithBindings<unknown>)[] | undefined; bindings?: Binding[] | undefined; } | undefined
@returnsComponentRef<C>
Примечания по использованию

Процесс инициализации

При инициализации компонента Angular монтирует его в целевой элемент DOM и запускает автоматическое обнаружение изменений. Целевой элемент DOM можно указать с помощью аргумента hostElement.

Если целевой элемент DOM не указан, Angular пытается найти его на странице, используя selector инициализируемого компонента (используется первый найденный элемент).

Пример

Обычно компонент для инициализации задаётся в массиве bootstrap NgModule, но для этого нам нужно знать компонент при написании кода приложения.

Представим ситуацию, когда нам нужно дождаться вызова API, чтобы определить, какой компонент инициализировать. Мы можем воспользоваться хуком ngDoBootstrap NgModule и вызвать этот метод для динамической инициализации компонента.

ngDoBootstrap(appRef: ApplicationRef) {
    this.fetchDataFromApi().then((componentName: string) => {
      if (componentName === 'ComponentOne') {
        appRef.bootstrap(ComponentOne);
      } else {
        appRef.bootstrap(ComponentTwo);
      }
    });
  }

При необходимости компонент можно смонтировать в элемент DOM, который не соответствует селектору инициализируемого компонента.

В следующем примере мы указываем CSS-селектор для поиска целевого элемента.

ngDoBootstrap(appRef: ApplicationRef) {
    appRef.bootstrap(ComponentThree, '#root-element');
  }

В этом примере мы передаём ссылку на узел DOM.

ngDoBootstrap(appRef: ApplicationRef) {
    const element = document.querySelector('#root-element');
    appRef.bootstrap(ComponentFour, element!);
  }
@paramcomponentType<C>
@paramhostElementstring | Element | undefined
@returnsComponentRef<C>

tick

void

Вызовите этот метод, чтобы явно запустить обнаружение изменений и связанные с ним побочные эффекты.

В режиме разработки tick() также запускает второй цикл обнаружения изменений, чтобы убедиться, что больше никаких изменений не обнаруживается. Если во время этого второго цикла обнаруживаются дополнительные изменения, привязки в приложении имеют побочные эффекты, которые невозможно устранить за один проход обнаружения изменений. В этом случае Angular выдаёт ошибку, поскольку в приложении Angular может быть только один проход обнаружения изменений, в течение которого должны быть обработаны все изменения.

@returnsvoid

attachView

void

Подключает представление, чтобы для него выполнялась проверка на наличие изменений. Представление автоматически отключается при уничтожении. Если представление уже подключено к ViewContainer, будет выброшена ошибка.

@paramviewRefViewRef
@returnsvoid

detachView

void

Снова отключает представление от проверки на наличие изменений.

@paramviewRefViewRef
@returnsvoid

onDestroy

VoidFunction

Регистрирует обработчик, который будет вызван при уничтожении экземпляра.

@paramcallback() => void

Функция обратного вызова, добавляемая в качестве обработчика.

@returnsVoidFunction

Функция, отменяющая регистрацию обработчика.

destroy

void

Уничтожает приложение Angular, представленное этим объектом ApplicationRef. Вызов этой функции уничтожает связанные инъекторы окружения, а также все инициализированные компоненты вместе с их представлениями.

@returnsvoid

viewCount

number

Возвращает количество подключённых представлений.

Примечания по использованию

Примеры использования isStable и предостережения

Обратите внимание на два важных момента, касающихся isStable, которые показаны в примерах ниже:

  • приложение никогда не станет стабильным, если при его запуске начать какую-либо повторяющуюся асинхронную задачу (например, процесс опроса с помощью setInterval, setTimeout или операторов RxJS, таких как interval);
  • Observable isStable выполняется вне зоны Angular.

Представим, что вы запускаете повторяющуюся задачу (здесь счётчик увеличивается с помощью RxJS interval) и одновременно подписываетесь на isStable.

constructor(appRef: ApplicationRef) {
  appRef.isStable.pipe(
     filter(stable => stable)
  ).subscribe(() => console.log('App is stable now');
  interval(1000).subscribe(counter => console.log(counter));
}

В этом примере isStable никогда не выдаст true, и сообщение «Приложение теперь стабильно» никогда не будет записано в журнал.

Если нужно выполнить действие, когда приложение станет стабильным, перед запуском процесса опроса необходимо дождаться стабилизации приложения.

constructor(appRef: ApplicationRef) {
  appRef.isStable.pipe(
    first(stable => stable),
    tap(stable => console.log('App is stable now')),
    switchMap(() => interval(1000))
  ).subscribe(counter => console.log(counter));
}

В этом примере сообщение «Приложение теперь стабильно» будет записано в журнал, после чего счётчик начнёт увеличиваться каждую секунду.

Также обратите внимание, что этот Observable выполняется вне зоны Angular, поэтому код в подписке на него не запускает обнаружение изменений.

Представим, что вместо записи значения счётчика в журнал вы обновляете поле компонента и отображаете его в шаблоне.

constructor(appRef: ApplicationRef) {
  appRef.isStable.pipe(
    first(stable => stable),
    switchMap(() => interval(1000))
  ).subscribe(counter => this.value = counter);
}

Поскольку Observable isStable выполняется вне зоны, поле value обновится правильно, но шаблон не будет обновлён!

Чтобы обновить шаблон, необходимо вручную запустить обнаружение изменений.

constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {
  appRef.isStable.pipe(
    first(stable => stable),
    switchMap(() => interval(1000))
  ).subscribe(counter => {
    this.value = counter;
    cd.detectChanges();
  });
}

Или выполните функцию обратного вызова подписки внутри зоны.

constructor(appRef: ApplicationRef, zone: NgZone) {
  appRef.isStable.pipe(
    first(stable => stable),
    switchMap(() => interval(1000))
  ).subscribe(counter => zone.run(() => this.value = counter));
}

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/api/core/ApplicationRef

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API