Dans mon application, j'ai essayé de placer un bouton qui affiche/cache un champ de saisie avec une propriété de composant booléen. Si le bouton affiche l'entrée, la mise au point doit être définie sur l'entrée. Mais cela ne semble pas fonctionner. Si je supprime le *ngIf
, la directive de mise au point fonctionne correctement. J'ai créé un plunker qui montre ce que je veux dire. C'est un peu difficile de décrire mon "problème".Angular2 en utilisant * ngIf avec la directive focus?
html dans le composant
<input *ngIf="filterShow.options"
[focus]="filterFocus.options"
[(ngModel)]="filter.options">
<button type="button"
(click)="setShowFilter('options')">
focus
</button>
fonction setShowFilter()
private setShowFilter(filter: string) {
this.filterShow[filter] = !this.filterShow[filter];
/* reset filter */
this.filter[filter] = "";
this.filterFocus[filter].emit(true);
}
focus.directive.ts
@Directive({
selector: '[focus]'
})
export class FocusDirective implements OnInit {
@Input('focus') focusEvent: EventEmitter<boolean>;
constructor(private elementRef : ElementRef,
private renderer : Renderer ) { }
ngOnInit() {
this.focusEvent.subscribe(event => {
this.renderer
.invokeElementMethod(this.elementRef.nativeElement, 'focus', []);
});
}
}
vous utilisez des émetteurs d'événements incorrect. ils sont pour l'enfant -> la communication parentale, pas pour le parent -> l'enfant. Ce que j'ai posté fonctionne pour moi: https://plnkr.co/edit/YtaRtA0e5L6ewxq7uCH9?p=preview – adharris
La méthode 'Renderer' et sa méthode' .invokeElementMethod() 'ont été abandonnées à ce moment-là. Il est maintenant prudent d'appeler 'this.elementRef.nativeElement.focus()' directement. –