J'ai un appel asynchrone/http et je souhaite définir le focus sur un élément error dans le modèle si un appel asynchrone génère une erreur.
class MyComponent {
constructor(private element: ElementRef) {}
doAsync() {
// do something async
$(this.element.nativeElement).find('.error').focus();
}
}
Quelle est la qualité d'inclure/utiliser JQuery dans angular 2?
De plus, je crois que la méthode Angular est censée fonctionner (MV *) consiste à "modifier le modèle en fonction duquel la vue réagit}". Alors, quelle est la bonne façon de le faire?
Essayons cela dans votre composante de focus
import --> AfterViewInit
export class YourComponent implements AfterViewInit {
@ViewChild('err') vc: any;
ngAfterViewInit() {
this.vc.nativeElement.focus();
}
}
utiliser ce composant html
<div #err class="alert alert-danger>{{errorPrompt}}</div>
Dans le résultat de votre fonction asynchrone, définissez une propriété sur le composant pour afficher ou masquer le message d'erreur.
class MyComponent {
hasErrors = false;
errorPrompt = "";
constructor() {}
doAsync() {
// do something async
this.hasErrors = true;
this.errorPrompt = "Fix the errors.";
}
}
Dans la marque:
<div class="alert alert-danger" *ngIf="hasErrors">{{errorPrompt}}</div>
Vous n'êtes pas tout à fait sûr du type d'élément '.error', mais vous pouvez essayer quelque chose comme ça
class MyComponent {
constructor(private renderer: Renderer2) { }
doAsync() {
// do something async
setTimeout(() => {
const element = this.renderer.selectRootElement('.error');
if (element) {
element.focus();
}
}, 200);
}
}
J'ai trouvé que setTimeout est parfois nécessaire si l'élément est imbriqué dans un * ngIf. Bien que ce ne soit pas la solution la plus propre, il vaut au moins mieux d’inclure jquery. Vous pouvez également définir votre propre directive pour une référence de mise au point automatique.