Angular2 öğesi üzerinde odaklamayı nasıl ayarlayabilirim. Bunu elementRef ile ayarlamak istemiyorum. Ben angularjs düşünüyorum böyle yönergeÖğe üzerinde bağlama ile netleme nasıl ayarlanır?
cevap
Basit 'odak' kullanarak yapıcı enjekte alır
this.renderer.invokeElementMethod(this.input.nativeElement, 'focus', []);
Yönergesi
import {Directive, Input, ElementRef} from 'angular2/core';
@Directive({
selector: '[focus]'
})
class FocusDirective {
@Input()
focus:boolean;
constructor(@Inject(ElementRef) private element: ElementRef) {}
protected ngOnChanges() {
this.element.nativeElement.focus();
}
}
// Usage
@Component({
selector : 'app',
template : `
<input [focus]="inputFocused" type="text">
<button (click)="moveFocus()">Move Focus</button>
`,
directives: [FocusDirective]
})
export class App {
private inputFocused = false;
moveFocus() {
this.inputFocused = true;
// we need this because nothing will
// happens on next method call,
// ngOnChanges in directive is only called if value is changed,
// so we have to reset this value in async way,
// this is ugly but works
setTimeout(() => {this.inputFocused = false});
}
}
angular2 sahip bir öğenin netlik ayarı en iyi yolu var Renderer
kullanarak ve eleman üzerindeki bir yöntemi çağırmak tarafından olmasıdır Angular2 yılında ngFocus direktifi yoktur. elementRef
olmadan bunu yapmanın bir yolu yoktur. Böyle bir şeye
Bu sonuçlar: renderer
protected renderer : Renderer
Çok daha basit bir yolu:
import { Directive, ElementRef, Renderer} from "@angular/core";
@Directive({
selector: "[Focus]"
})
export class myFocus {
constructor(private _el: ElementRef, private renderer: Renderer) {
this.renderer.invokeElementMethod(this._el.nativeElement, 'focus');
}
}
Her iki varyantı denedim ancak hiçbiri basit kullanım için uygun değil. İlk olarak (@AngJobs tarafından) yönerge kullandığınız bileşende ek işleve ihtiyaç duyarsınız (set = true), 2. (@ShellZero ile) hiç çalışmıyor çünkü odaklama gerçekten görünümden önce çağrılır. Bu yüzden odak aramayı ngAfterViewInit
'a taşıdım. Şimdi sadece <input focus...
'u ekleyebilir ve unutabilirsiniz. Eleman, otomatik olarak init görüntülendikten sonra odaklanacaktır.
import { Directive, ElementRef, Renderer, AfterViewInit } from '@angular/core';
@Directive({
selector: '[focus]'
})
export class DmFocusDirective implements AfterViewInit {
constructor(private _el: ElementRef, private renderer: Renderer) {
}
ngAfterViewInit() {
this.renderer.invokeElementMethod(this._el.nativeElement, 'focus');
}
}
Teşekkürler - bu harika. Sınıf isminizin zorunlu olarak öneklemeye gerek duymasa da (Dm ile yaptığınız gibi). Bir önek uygulanacak anahtar bit, seçici isim değeridir. yani seçici: '[appFocus]' '. Bu, sonraki açısal versiyonlarda vb. Çarpışma olasılığını azaltır. – ne1410s
Heads up: "Renderer", kullanımdan kaldırıldı ve Açısal ekip, "Renderer2" içine invokeElementMethod() 'i getirmeyi planlamıyor. https://github.com/angular/angular/issues/13818 – stealththeninja
Benim için çalışır, ancak konsolda hatalar var. Hata ayıklama ve aramadan sonra bu makaleyi okuyun: https://www.picnet.com.au/blogs/guido/post/2016/09/20/angular2-ng2-focus-directive/
Yalnızca kopyala yapıştır. Benim için mükemmel çalıştı.
import {Directive, AfterViewInit, ElementRef, DoCheck} from '@angular/core';
@Directive({selector: '[focus]'})
export class FocusDirective implements AfterViewInit, DoCheck {
private lastVisible: boolean = false;
private initialised: boolean = false;
constructor(private el: ElementRef) {
}
ngAfterViewInit() {
console.log('inside FocusDirective.ngAfterViewInit()');
this.initialised = true;
this.ngDoCheck();
}
ngDoCheck() {
console.log('inside FocusDirective.ngDoCheck()');
if (!this.initialised) {
return;
}
const visible = !!this.el.nativeElement.offsetParent;
if (visible && !this.lastVisible) {
setTimeout(() => {
this.el.nativeElement.focus();
}, 1);
}
this.lastVisible = visible;
}
}
Oluşturucu hizmeti artık (Açısal 4.x itibariyle) deprecated yeni Renderer2 hizmet invokeElementMethod yok olduğunu. Ne yapabilirsiniz böyle öğeye bir başvuru elde etmektir:
const element = this.renderer.selectRootElement('#elementId');
Ve sonra şöyle bu unsura odaklanmaktadır için kullanabilirsiniz:
element.focus();
Daha selectRootElement
here nasıl çalıştığı hakkında :
DÜZENLEME: eleman odaklı almaz
ise sık karşılaşılan bir sorun elemanı hazır olmamasıdır. (örneğin: devre dışı, gizli vb.). Bunu yapabilirsiniz:
setTimeout(() => element.focus(), 0);
Bu yeni VM sırayla çalışacak bir macrotask yaratacak, böylece eleman etkinse odağı düzgün çalışacaktır.
import { Directive, ElementRef, AfterViewChecked } from '@angular/core';
@Directive({
selector: '[autoFocus]',
})
export class FocusDirective implements AfterViewChecked {
constructor(private _elementRef: ElementRef) { }
ngAfterViewChecked() {
this._elementRef.nativeElement.focus()
}
}
- 1. ListView'lere öğe eklerken animasyonlar/geçişler nasıl ayarlanır?
- 2. PreRender üzerinde bağlama kontrolleri
- 3. contentEditable ile bir öğe üzerinde 'sürüklenebilir' özelliğini nasıl etkinleştirebilirim?
- 4. KnockOut JS ile dinamik bağlama nasıl yapılır?
- 5. UIAlertView'ın UITextField üzerinde otomatik kapitalizasyon nasıl ayarlanır?
- 6. WPF - Öğeye bağlama Öğe içinden öğe içinden ItemControl?
- 7. Silverlight'ta grup radyo düğmesi için veri bağlama nasıl ayarlanır?
- 8. Raylar üzerinde geçişte birincil anahtar nasıl ayarlanır?
- 9. MVVM, WPF: Bir combobox'ta seçili bir öğe nasıl ayarlanır
- 10. Linux üzerinde CMake ile paylaşılan kitaplığa destek bağlama
- 11. Javascript ile strftime nasıl ayarlanır?
- 12. MDMailComposeViewController ile hesaplamalar nasıl ayarlanır
- 13. WPF Doğrudan DataContext ile Bağlantılı Bağlama Bağlama
- 14. Video ile sprite/GIF resmi nasıl ayarlanır?
- 15. eleman diğer öğe üzerinde ve altına sabitlenmiş
- 16. Karmaşık winform üzerinde veri bağlama denetimlerini eşitleme
- 17. Rayları Rapid ile Bağlama
- 18. Node.js ile Unity3d Bağlama
- 19. Alt öğe üzerinde yeniden oluşturma işleminde alt öğe değişikliği gerçekleştirme
- 20. Oracle DBMS_ADVANCED_REWRITE bağlama değişkeni ile nasıl kullanılır?
- 21. parametre paketinde her öğe üzerinde işlevini uygulayın
- 22. Ramlink RT5370 ile hostapd yapılandırması nasıl ayarlanır?
- 23. Google Goggles Fotoğraf Makinesi Otomatik Netleme
- 24. Yazıcı ile android tablet bağlama
- 25. SDL2 kitaplıklarını CMake ile bağlama
- 26. WPF: Kod ile veri bağlama
- 27. QPushButton'da görüntü nasıl ayarlanır?
- 28. Biçim dizgisi ile MvvMCross Bağlama
- 29. Angular2: yönlendirme ile veri bağlama
- 30. X'te ElementName için alternatif: DataTemplates ile bağlama
Küçük bir başlık. Doğrudan "nativeElement" kullanmayın. Bu web çalışanları ile tasarruf değil. – PierreDuc
"Yönergeler" özelliği RC 6'da kaldırılmıştır. "FocusDirective" öğesini NgModule dekoratörünüzün beyannamelerine taşımalısınız. – cnotethegr8
Aynı gereksinime sahibim fakat setTimeout'u yönerge içinde değiştirmek istiyorum, direktif içinde setTimeout kullanılarak aynı işlevsellik elde edilebilir mi? –