Обнаружение изменения запуска Вручную в Angular
Я пишу угловой компонент, который имеет свойство Mode(): string
. Я хотел бы иметь возможность установить это свойство программно не в ответ на какое-либо событие. Проблема в том, что при отсутствии события браузера, привязка шаблона {{Mode}}
не обновляет. Есть ли способ запустить это обнаружение изменений вручную?
4 ответов
попробуйте один из этих:
-
ApplicationRef.tick()
- подобно AngularJS$rootScope.$digest()
-- т. е. проверьте полное дерево компонентов -
NgZone.run(callback)
- аналогично$rootScope.$apply(callback)
-- т. е. оцените функцию обратного вызова внутри угловой зоны. Я думаю, но я не уверен, что это заканчивается проверкой полного дерева компонентов после выполнения функции обратного вызова. -
ChangeDetectorRef.detectChanges()
- аналогично$scope.$digest()
-- т. е. проверить только этот компонент и его дети
вы можете впрыснуть ApplicationRef
, NgZone
или ChangeDetectorRef
в компоненте.
я использовал принятую ссылку на ответ и хотел бы привести пример, так как Angular 2 documentation очень трудно читать, я надеюсь, что это проще:
-
импорт
NgZone
:import { Component, NgZone } from '@angular/core';
-
добавить его в конструктор класса
constructor(public zone: NgZone, ...args){}
-
выполнить код с
zone.run
:this.zone.run(() => this.donations = donations)
я смог обновить его с помощью markForCheck ()
Импорт ChangeDetectorRef
import { ChangeDetectorRef } from '@angular/core';
Inject и инстанцировать его
constructor(private ref: ChangeDetectorRef) {
}
наконец отметить обнаружение изменений, чтобы иметь место
this.ref.markForCheck();
вот пример, где markForCheck() работает, а detectChanges () нет.
https://plnkr.co/edit/RfJwHqEVJcMU9ku9XNE7?p=preview
EDIT: этот пример не отображает проблему больше : (я считаю, что он может работать с более новой угловой версией, где он исправлен.
(нажмите STOP / RUN, чтобы запустить его снова)
в Angular 2 + попробуйте @ input decorator
Он допускает некоторую хорошую привязку свойств между родительскими и дочерними компонентами.
сначала создайте глобальную переменную в Родительском объекте для хранения объекта / свойства, которое будет передано ребенку.
далее создайте глобальную переменную в дочернем элементе, чтобы передать объект / свойство от родителей.
затем в Родительском html, где используется дочерний шаблон, добавьте квадрат скобки обозначение С именем дочерней переменной, затем установите его равным имени родительской переменной. Пример:
<child-component-template [childVariable] = parentVariable>
</child-component-template>
наконец, если дочернее свойство определено в дочернем компоненте, добавьте Входной декоратор:
@Input()
public childVariable: any
когда ваша родительская переменная обновляется, она должна передать обновления дочернему компоненту, который обновит свой html.
кроме того, чтобы вызвать функцию в дочернем компоненте, взгляните на ngOnChanges.