在我的應用程序中,我想自動將焦點放在組件加載的第一個表單域上。任何人都可以請指導如何實現這個沒有任何重複,因爲我想要在我的應用程序中的每個窗體(Reactive窗體)。Angular 2將重點放在組件加載的表單的第一個字段
5
A
回答
3
您應該使用指令來實現此行爲。
這將顯示你的方式如何做到這一點:https://plnkr.co/edit/ttxCP7vCLkLtNb3Xiaah?p=preview
import {Component, NgModule, Directive, ElementRef, Renderer} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
@Directive({
selector: 'form[anyNameHere]'
})
export class SelectFirstInputDirective {
constructor(private _eRef: ElementRef, private _renderer : Renderer) { }
private _getInputElement(nativeElement: any): any {
if (!nativeElement || !nativeElement.children) return undefined;
if (!nativeElement.children.length && nativeElement.localName === 'input' && !nativeElement.hidden) return nativeElement;
let input;
[].slice.call(nativeElement.children).every(c => {
input = this._getInputElement(c);
if (input) return false; // break
return true; // continue!
});
return input;
}
ngAfterViewInit() {
let formChildren = [].slice.call(this._eRef.nativeElement.children);
formChildren.every(child => {
let input = this._getInputElement(child);
if (input) {
this._renderer.invokeElementMethod(input, 'focus', []);
return false; // break!
}
return true; // continue!
});
}
}
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello {{name}}</h2>
<form anyNameHere>
<div class="form-group">
<input hidden formcontrolname="firstName" type="text" class="form-control input-sm ng-pristine ng-valid ng-touched" placeholder="First Name" id="firstName">
<label class="col-sm-3 control-label" for="firstName">Name</label>
<div class="col-sm-9 form-inline">
<div class="form-group">
<div class="col-sm-12">
<input formcontrolname="firstName" type="text" class="form-control input-sm ng-pristine ng-valid ng-touched" placeholder="First Name" id="firstName">
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<input formcontrolname="lastName" type="text" class="form-control input-sm ng-untouched ng-pristine ng-valid" placeholder="Last Name" id="lastName">
</div>
</div>
</div>
</div>
</form>
</div>
`,
})
export class App {
constructor() {
this.name = 'Angular2'
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, SelectFirstInputDirective ],
bootstrap: [ App ]
})
export class AppModule {}
2
具有角4,渲染器已被棄用,因此該指令的方式消失了。不過,無論如何,你總是可以使用一個「快速和骯髒」的方式:將引用添加到您想將焦點設置,只需使用<reference-name>.focus()
<form [formGroup]="form" (ngSubmit)="onSubmit(form, $event); needFocus.focus()">
<input placeholder="" formControlName="name" #needFocus>
</form>
-1
繼元件接近你可以使用=> 1.你可以做到這個由autoFoucs指示或 2.提供參考您的控制像
<input hidden #firstName formcontrolname="firstName" type="text" class="form-control input-sm ng-pristine ng-valid ng-touched" placeholder="First Name" id="firstName">
然後在TS文件中聲明這樣
export class App implements OnInit{
@ViewChild('firstName') firstNameTextbox;
constructor() {
}
ngOnInit() {
this.firstNameTextbox.nativeElement.focus();
}
}
2
您可以通過簡單地將「自動聚焦」屬性添加到您的輸入元素來實現此目的。
<input class="form-control" [formControl]="name" autofocus>
+0
只有在加載頁面後,輸入纔會獲得焦點。但是,如果您在應用程序中導航並返回頁面,則輸入不會再獲得焦點。 自動對焦不適用於單頁應用程序。 – gentiane
0
HTML autofocus attribute做到這點
<input type="text" name="fname" autofocus>
相關問題
- 1. 將Angular 2組件加載到區域
- 2. Angular 2 - 加載組件
- 3. 重點放在一個表單字段與變量
- 4. Angular 2 - 逐個加載動態組件
- 5. Angular 2將表單數據傳遞給另一個組件
- 6. agiletoolkit重新加載一個CRUD表單的字段
- 7. 加入第一個字段的2個文件
- 8. 僅加載4個字段的2個字段 - Pig to Hive表
- 9. Angular 2:包含子組件的表單
- 10. Angular 2表單驗證動態字段
- 11. 如何忽略Angular 2中組件第一次加載時的Observable .interval()
- 12. 將2個jQuery日期選擇器輸入字段放在一個表單中
- 13. Angular 2按對象排列組的第一個字母
- 14. Angular 2:在第n個孩子後動態添加組件
- 15. Karma無法加載Angular 2組件
- 16. Angular 2:推遲組件加載
- 17. Angular 2 rc6組件未加載
- 18. Javascript將重點放在下一個輸入字段
- 19. 將一個表單的值複製到第二個表單的隱藏字段
- 20. 把重點放在劍道網格彈出編輯表單的第一個字段
- 21. Angular 2中的數組字段
- 22. Angular 2 - 從父組件的「第一個子組件」到「第二個子組件」的路由
- 23. 第一次加載的組件中的組件
- 24. 重新加載按鈕點擊另一個組件的角度2/4
- 25. 如何將焦點放在TextBox的表單加載時?
- 26. 使用AOT在Angular 2中加載不存在的組件
- 27. 重點是在第一個字段下拉後的形式 - Bootstrap
- 28. Angular 2+可重用組件
- 29. 將表單輸入字段加載到一個javascript數組中,然後驗證
- 30. 將一個字段放入數組中?
謝謝你這麼多@mxii。顯然,上面的指令應該把重點放在表單中的第一個輸入字段上,並在plunker中完成。但是,當我在我的應用程序中測試它時,它不起作用,可能是因爲在我的情況下,輸入字段是在div標籤下。有什麼方法可以查詢和選擇輸入元素,然後將焦點設置爲第一個輸入。目前,您正在使用this._eRef.nativeElement.children選擇表單的所有子項。 –
看到我更新的答案/ plunker ..你需要做一個遞歸搜索! :) – mxii
仍然沒有成功,我登錄,輸入後,在這條線在輸入的值,並且讓input = this._getInputElement(child);它的不確定性。請看看https://plnkr.co/edit/YF7M4ph7891x03hjJr6A?p=preview –