się być pomocny, będę uprościć odpowiedź i skupić się na reaktywnej Extensions (Rx) sposób interakcji z ngModel dyrektywy , tylko dlatego, że potężny i ma najlepszą integrację z silnikiem wykrywania zmian kątowej 2, pod względem wydajności.
Najpierw musimy podkreślić, że NgModel jest związany z wartością Elementu, a wszystkie zmiany są propagowane za pośrednictwem subskrypcji EventEmitter, którą subskrybujesz. The EventEmitter to typ Angular2, który jest obiektem Rx, który jest w zasadzie obiektem, który może "transmitować" (emitować) zdarzenia/dane, a także może reagować na dane "odebrane". Tak więc w Rx land jest obserwowalny i obserwatorem.
Warto również wspomnieć o metodzie "ngOnChanges" na ngModel, która odbiera procedurę obsługi zdarzeń zmian, ale skupimy się na podejściu Rx.
Musimy więc uzyskać dostęp do tego Obserwowalnego i zasubskrybować go, świetnie!
Aby uzyskać dostęp, używamy wtrysku zależnego, po prostu oświadczając, że chcemy, aby NgModel był w konstruktorze naszej dyrektywy.
Teraz musimy też zachować ostrożność, musimy upewnić się, że otrzymamy NgModel, bo inaczej będziemy mieć błędy.
Możemy to zrobić dyskretnie, tworząc selektor dyrektywy, które wymusza element NgModel, jak: „selektor”: „[myCustomDirective] [ngModel]”, teraz jeśli ngModel nie jest częścią elementu to won” t pasuje do selektora naszej dyrektywy.
Lub możemy hałasować i nie wychodzić cicho, zaznaczamy zastrzyk zależności jako @Opcjonalnie, a jeśli jego wartość zerowa możemy podać wyraźny wyjątek mówiąc, czego brakuje. Jeśli nie będziemy oznaczyć go jako @Opcja kątowa spowoduje wygenerowanie ogólnej wiadomości o brakującej zależności, jest ona ok, ale nie jest dobra.
Teraz przykład:
import {Directive, Optional} from 'angular2/core';
import {NgModel}from 'angular2/common';
@Directive({
selector: '[myCustomDirective][ngModel]'
})
export class MyCustomDirective {
constructor(@Optional() public model: NgModel) {
if (!model)
throw new Error ("myCustomDirective requires ngModel.");
// this code should be in a designated functions...
// register to incoming changes to the model
// we can also transform values..., for example take only distinct values...
// this.model.update.distinctUntilChanged()...
let subscription = this.model.update.subscribe((newValue) => {
// Changes happen here, do something with them...
// note that the value of this.model is still the old value
// The local parameter "newValue" holds the new value.
});
// We can also change the value of the model:
this.model.update.emit('something...');
}
}
Mam nadzieję, że pomogło.
thankyou, ale jak stwierdził, chcę dyrektywa wykryć te zmiany, aby nie trzeba dodawać go do Kod html textarea –
działa tylko wtedy, gdy wpisujesz tekst, a nie, jeśli model zmienia się z innego obszaru tekstowego powiązanego z tym samym modelem. –
Jeśli "customertext" to '@Input()'? Wdrożenie 'ngModelChange (change)' w twojej dyrektywie i dodanie twojego kodu do reakcji na zmiany powinno zrobić to, co chcesz. –