Ręczne wyzwalanie detekcji zmiany kątowej
Piszę element kątowy, który ma właściwość Mode(): string
. Chciałbym móc ustawić tę właściwość programowo nie w odpowiedzi na żadne zdarzenie. Problem polega na tym, że w przypadku braku zdarzenia przeglądarki, powiązanie szablonu {{Mode}}
nie aktualizuje się. Czy istnieje sposób, aby ręcznie uruchomić wykrywanie zmian?
4 answers
Spróbuj jednego z tych:
-
ApplicationRef.tick()
- podobne do AngularJS ' s$rootScope.$digest()
-- tzn. sprawdź pełne drzewo komponentów -
NgZone.run(callback)
- podobne do$rootScope.$apply(callback)
-- tj., ocenić funkcję zwrotną wewnątrz strefy kątowej. Myślę, ale nie jestem pewien, że kończy się to sprawdzeniem pełnego drzewa komponentów po wykonaniu funkcji callback. -
ChangeDetectorRef.detectChanges()
- podobne do$scope.$digest()
-- tzn. sprawdzaj tylko ten komponent i jego dzieci
Możesz wstrzyknięcie ApplicationRef
, NgZone
, lub ChangeDetectorRef
do twojego komponentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 21:34:12
Użyłem accepted answer reference i chciałbym podać przykład, ponieważ dokumentacja Angular 2 jest bardzo trudna do odczytania, mam nadzieję, że będzie łatwiej: {]}
-
Import
NgZone
:import { Component, NgZone } from '@angular/core';
-
Dodaj go do swojej klasy konstruktor
constructor(public zone: NgZone, ...args){}
-
Uruchom kod z
zone.run
:this.zone.run(() => this.donations = donations)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 17:04:12
Udało mi się zaktualizować go za pomocą markForCheck()
Import ChangeDetectorRef
import { ChangeDetectorRef } from '@angular/core';
Inject and instantiate it
constructor(private ref: ChangeDetectorRef) {
}
Na koniec zaznacz wykrywanie zmian
this.ref.markForCheck();
Oto przykład, w którym markForCheck() działa, a detectChanges() Nie.
Https://plnkr.co/edit/RfJwHqEVJcMU9ku9XNE7?p=preview
EDIT: ten przykład już nie przedstawia problemu: (wydaje mi się, że może działać nowszy Angular wersja, w której jest naprawiona.
(Naciśnij STOP / RUN, aby uruchomić go ponownie)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 16:33:56
W Angular 2+ wypróbuj dekorator @ Input
Pozwala na pewne ładne powiązanie właściwości między komponentami nadrzędnymi i podrzędnymi.
Najpierw Utwórz zmienną globalną w rodzicu do przechowywania obiektu / właściwości, które zostanie przekazany dziecku.
Następnie Utwórz zmienną globalną w potomku, aby utrzymać obiekt / właściwość przekazaną od rodzica.
Następnie w nadrzędnym html, gdzie używany jest szablon potomny, dodaj nawiasy kwadratowe zapis z imieniem dziecka zmienną, następnie ustaw ją równą nazwie zmiennej macierzystej. Przykład:
<child-component-template [childVariable] = parentVariable>
</child-component-template>
Wreszcie, gdy właściwość child jest zdefiniowana w komponencie child, dodaj Input decorator:
@Input()
public childVariable: any
Gdy zmienna rodzica zostanie zaktualizowana, powinna przekazać aktualizacje do komponentu podrzędnego, który zaktualizuje jej kod html.
Również, aby uruchomić funkcję w komponencie potomnym, spójrz na ngOnChanges.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-22 16:18:48