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>Promise<void>Promise, который разрешается, когда приложение становится стабильным
injector
EnvironmentInjectorEnvironmentInjector, используемый для создания этого приложения.
bootstrap
2 перегрузкиИнициализирует компонент на элементе, найденном по его селектору, или, при необходимости, на указанном элементе.
{ hostElement?: string | Element | undefined; directives?: (Type<unknown> | DirectiveWithBindings<unknown>)[] | undefined; bindings?: Binding[] | undefined; } | undefined
ComponentRef<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!);
}
tick
voidВызовите этот метод, чтобы явно запустить обнаружение изменений и связанные с ним побочные эффекты.
В режиме разработки tick() также запускает второй цикл обнаружения изменений, чтобы убедиться, что больше никаких изменений не обнаруживается. Если во время этого второго цикла обнаруживаются дополнительные изменения, привязки в приложении имеют побочные эффекты, которые невозможно устранить за один проход обнаружения изменений. В этом случае Angular выдаёт ошибку, поскольку в приложении Angular может быть только один проход обнаружения изменений, в течение которого должны быть обработаны все изменения.
void
attachView
voidПодключает представление, чтобы для него выполнялась проверка на наличие изменений. Представление автоматически отключается при уничтожении. Если представление уже подключено к ViewContainer, будет выброшена ошибка.
void
detachView
voidonDestroy
VoidFunctionРегистрирует обработчик, который будет вызван при уничтожении экземпляра.
() => voidФункция обратного вызова, добавляемая в качестве обработчика.
VoidFunctionФункция, отменяющая регистрацию обработчика.
destroy
voidУничтожает приложение Angular, представленное этим объектом ApplicationRef. Вызов этой функции уничтожает связанные инъекторы окружения, а также все инициализированные компоненты вместе с их представлениями.
void
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