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?

Author: Lazar Ljubenović, 2016-01-16

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.

 427
Author: Mark Rajcok,
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: {]}

  1. Import NgZone:

    import { Component, NgZone } from '@angular/core';
    
  2. Dodaj go do swojej klasy konstruktor

    constructor(public zone: NgZone, ...args){}
    
  3. Uruchom kod z zone.run:

    this.zone.run(() => this.donations = donations)
    
 81
Author: juanpastas,
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)

 45
Author: Nuno Tomas,
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.

 2
Author: Jeremy Swagger,
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