J'ai mis à jour de Angular2 à Angular4 et dans la documentation, il est écrit de manière à utiliser le Renderer2
au lieu de Renderer
, qui est obsolète.
Maintenant, je cherche dans le fichier Renderer ( https://github.com/angular/angular/blob/master/packages/core/src/render/api.ts ) mais je ne trouve pas un moyen d'appeler le focus de manière i habitué.
Ancienne méthode:
this.renderer.invokeElementMethod(element, 'focus', []);
Quelle est la nouvelle méthode?
EDIT
Que se passe-t-il si l'élément que je sélectionne se fait via QuerySelector, par exemple:
let inputField = document.querySelectorAll('.dialog input');
if ( inputField[0] ) {
inputField[0].focus();
}
Depuis sa sélection à l'aide de querySelector, la méthode de focus n'existe pas sur elle.
La invokeElementMethod
est obsolète et ne retrouvera pas son chemin dans le nouveau rendu. Pour définir le focus sur un élément, vous pouvez simplement l'utiliser maintenant:
element.nativeElement.focus();
Si vous utilisez document.querySelectorAll
, vous faites quelque chose qui n’est pas angulaire et vous devriez trouver un autre moyen de le faire. S'il n'y a pas d'autre moyen de le faire, alors le même principe s'applique. La méthode focus()
est javascript, vous pouvez donc l'utiliser dans angular2/TypeScript. Assurez-vous de bien insérer la variable querySelectorAll
dans le crochet ngAfterViewInit
du composant:
ngAfterViewInit() {
let inputField: HTMLElement = <HTMLElement>document.querySelectorAll('.dialog input')[0];
inputField && inputField.focus();
}
Vous pouvez aussi utiliser selectRootElement method of Renderer2 .
Par exemple:
constructor(private renderer: Renderer2) {}
this.renderer.selectRootElement('#domElementId').focus()
, où domElementId est id = 'domElementId' dans votre code HTML
template reference variable :#inlineEditControl
<input #inlineEditControl class="form-control form-control-lg" [placeholder]="label">
@ViewChild('inlineEditControl') inlineEditControl: ElementRef; // input DOM element
this.inlineEditControl.nativeElement.focus();
À l'heure actuelle, il semble que cette tâche ne soit pas réalisable sans modifier directement le DOM. Comme d'autres l'ont dit, invokeElementMethod () est obsolète. Cependant, vous rencontrerez également des problèmes d'utilisation de selectRootElement, car ce n'est pas son objectif et vous finirez par perdre les enfants à l'intérieur de votre DIV. Voici un lien vers une question SO qui explique plus en détail selectRootElement (car la documentation angulaire est atroce):
Renderer multiple selectRootElement Issue (avec plnkr fourni)
Pour l’instant, il semble que le seul moyen d’atteindre facilement votre objectif est d’utiliser une variable de référence de modèle, un enfant de vue et le yourViewChild.nativeElement.focus () (bien que cette pratique ne soit également pas recommandée)
Une solution de contournement suggérée utilisant un FocusService se trouve également dans ce numéro de GitHub: https://github.com/angular/angular/issues/15674
Dans ce numéro, Tytskyi indique qu'il est possible d'implémenter FocusService et de fournir différentes implémentations de focus () basées sur AppModuleBrowser et AppModuleServer. Je ne suis pas sûr de la précision de son fonctionnement, mais c'est peut-être le seul moyen d'y parvenir sans utiliser nativeElement pour le moment.