Nous avons mis en place une directive observable ngModelChange qui envoie toutes les modifications du modèle par le biais d'un émetteur d'événements que vous instanciez dans votre propre composant. Il vous suffit de lier votre émetteur d'événements à la directive.
Voir : https://github.com/atomicbits/angular2-modelchangeobservable
En html, liez votre émetteur d'événements (countryChanged dans cet exemple) :
<input [(ngModel)]="country.name"
[modelChangeObservable]="countryChanged"
placeholder="Country"
name="country" id="country"></input>
Dans votre composant typescript, effectuez quelques opérations asynchrones sur l'EventEmitter :
import ...
import {ModelChangeObservable} from './model-change-observable.directive'
@Component({
selector: 'my-component',
directives: [ModelChangeObservable],
providers: [],
templateUrl: 'my-component.html'
})
export class MyComponent {
@Input()
country: Country
selectedCountries:Country[]
countries:Country[] = <Country[]>[]
countryChanged:EventEmitter<string> = new EventEmitter<string>()
constructor() {
this.countryChanged
.filter((text:string) => text.length > 2)
.debounceTime(300)
.subscribe((countryName:string) => {
let query = new RegExp(countryName, 'ig')
this.selectedCountries = this.countries.filter((country:Country) => {
return query.test(country.name)
})
})
}
}
2 votes
J'avais une question similaire concernant la création d'un composant de dialogue auquel on pouvait accéder à partir de n'importe quel point du domaine : stackoverflow.com/questions/34572539/ En gros, une solution consiste à placer un émetteur d'événements dans un service
1 votes
Voici mon implémentation d'un tel service en utilisant RXJS qui permet d'obtenir les nièmes dernières valeurs sur abonnement. stackoverflow.com/questions/46027693/