Voici mon code actuel:
import { Directive, ElementRef, Input } from "@angular/core";
@Directive({
selector: "[autofocus]"
})
export class AutofocusDirective
{
private focus = true;
constructor(private el: ElementRef)
{
}
ngOnInit()
{
if (this.focus)
{
//Otherwise Angular throws error: Expression has changed after it was checked.
window.setTimeout(() =>
{
this.el.nativeElement.focus(); //For SSR (server side rendering) this is not safe. Use: https://github.com/angular/angular/issues/15008#issuecomment-285141070)
});
}
}
@Input() set autofocus(condition: boolean)
{
this.focus = condition !== false;
}
}
cas d'utilisation:
[autofocus] //will focus
[autofocus]="true" //will focus
[autofocus]="false" //will not focus
Codes périmés (ancien réponse, juste au cas où):
J'ai fini avec ce code:
import {Directive, ElementRef, Renderer} from '@angular/core';
@Directive({
selector: '[autofocus]'
})
export class Autofocus
{
constructor(private el: ElementRef, private renderer: Renderer)
{
}
ngOnInit()
{
}
ngAfterViewInit()
{
this.renderer.invokeElementMethod(this.el.nativeElement, 'focus', []);
}
}
Si je mets le code en ngOnViewInit
il ne fonctionne pas. Code aussi utiliser les meilleures pratiques, depuis l'appel de se concentrer sur l'élément directement n'est pas recommandé.
Édité (conditionnel autofocus):
Il y A quelques jours j'avais besoin d'conditionnelle auto focus, parce que j'ai cacher d'abord autofocus élément et je veux me concentrer un autre, mais uniquement lors de la première n'est pas visible, et j'ai fini avec ce code:
import { Directive, ElementRef, Renderer, Input } from '@angular/core';
@Directive({
selector: '[autofocus]'
})
export class AutofocusDirective
{
private _autofocus;
constructor(private el: ElementRef, private renderer: Renderer)
{
}
ngOnInit()
{
}
ngAfterViewInit()
{
if (this._autofocus || typeof this._autofocus === "undefined")
this.renderer.invokeElementMethod(this.el.nativeElement, 'focus', []);
}
@Input() set autofocus(condition: boolean)
{
this._autofocus = condition != false;
}
}
Edited2:
Moteur de rendu.invokeElementMethod est obsolète et nouvelles Renderer2 ne le supporte pas.
Nous sommes donc de retour à la maternelle focus (qui ne travaillent pas à l'extérieur de DOM - SSR, par exemple!).
import { Directive, ElementRef, Input } from '@angular/core';
@Directive({
selector: '[autofocus]'
})
export class AutofocusDirective
{
private _autofocus;
constructor(private el: ElementRef)
{
}
ngOnInit()
{
if (this._autofocus || typeof this._autofocus === "undefined")
this.el.nativeElement.focus(); //For SSR (server side rendering) this is not safe. Use: https://github.com/angular/angular/issues/15008#issuecomment-285141070)
}
@Input() set autofocus(condition: boolean)
{
this._autofocus = condition != false;
}
}
cas d'utilisation:
[autofocus] //will focus
[autofocus]="true" //will focus
[autofocus]="false" //will not focus