2015-12-07 7 views
29

Mam dyrektywę i na niej jest @Input, która akceptuje klasę.W angleular2, jak uzyskać zmiany w zmianach właściwości dla obiektu wysyłanego dla @Input

@Directive({selector: 'my-directive'}) 
@View({directives: [CORE_DIRECTIVES]}) 
export class MyDirective { 
    @Input() inputSettings : SettingsClass; 
    @Input() count : number; 

    onChanges(map) { 
     console.log('onChanges'); 
    } 
} 

Dyrektywa służy w html:

... 
    <my-directive [input-settings]="settings" [count]="settings.count"></my-directive> 
    ... 

Jeśli settings.count zmienia się wówczas onChanges będzie ogień. Jeśli jakakolwiek inna właściwość w klasie ustawień ulegnie zmianie, to nie zostanie uruchomiona.

Jak mogę wykryć, czy na jakiejś właściwości w ustawieniach?

+0

Domyślam się to (obecnie?) nie działa ... może dlatego, że 'inputSettings' zawiera odwołanie do instancji obiektu i ponieważ samo odniesienie się nie zmienia, Angular prawdopodobnie nie próbuje porównywać właściwości obiektu, więc nie widzi ani nie zgłasza zmiana. (Mam nadzieję, że się mylę, lub mam nadzieję, że to naprawią). –

+0

Rzeczywiście, [blog autora Victora Savkina] (http://victorsavkin.com/post/133936129316/artykuly-immutability-and-encapsulation) potwierdził moje przypuszczenia: "Jeśli obiekt adresowy jest zmienny, inny składnik może zaktualizować właściwość street bez tworzenia nowego obiektu adresu. Jeśli tak się stanie, hook onChanges nie zostanie wywołany". –

+0

można również użyć programu pobierającego i ustawiającego dla właściwości wejściowej atrybutu – Ayyash

Odpowiedz

46

kątowy zauważy tylko wtedy, gdy obiekt został zmieniony na inny obiekt (czyli odniesienia obiektu zmienione), więc ngOnChanges() nie może zostać użyte do rozwiązania twojego problemu. Aby uzyskać więcej informacji, patrz Victor Savkin's blog post.

Możesz zastosować metodę ngDoCheck() w swojej klasie MyDirective. Ten hak cyklu życia jest nazywany "za każdym razem, gdy sprawdzane są właściwości wejściowe komponentu lub dyrektywy, użyj go, aby rozszerzyć wykrywanie zmian, wykonując niestandardową kontrolę."

Aby zaimplementować metodę wyboru niestandardowego, to trzeba najpierw wdrożyć .equals() metodę na klasy SettingsClass takie, które można następnie napisać kod taki jak poniżej w ngDoCheck():

ngDoCheck() { 
    if(!this.inputSettings.equals(this.previousInputSettings)) { 
     // inputSettings changed 
     // some logic here to react to the change 
     this.previousInputSettings = this.inputSettings; 
    } 
} 
-4

w HTML nie można używać CamelCase, zmień go na

<my-directive [input-settings]="settings" [count]="settings.count"></my-directive>

+0

Dobry połów, ale to nie powoduje, że onChanges nie strzela. Po prostu wpisałem to źle w przykładzie. – Peter

+5

To już jest przestarzałe. Ponieważ w atrybutach alpha.52 w szablonach rozróżniana jest wielkość liter. –

+0

Rzeczywiście, w Angular's HTML rozróżniana jest wielkość liter, nawet jeśli sam HTML nie powinien być rozróżniany wielkość liter. Angular jest krytykowany za to. Powoduje to również zamieszanie. – Gherman