2017-07-03 6 views
-2

ngFor内の特定のinput要素にフォーカスを設定すると、IOSデバイスでは機能しません。他のすべての場所でうまく機能します。ローカルテンプレート変数を使用して入力にフォーカスを設定しても、IOSでは機能しませんか?

HTML

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div *ngFor="let item of [1,2,3,4]; let i = index"> 
     <button type="button" (click)="show = i; input.focus()">Click to show and set focus</button> 
     <input #input *ngIf="show == i" type="text" > 
    </div> 
    `, 
}) 

活字体:

export class App { 
    show = -1; 
    constructor() { 
    } 
} 

plunker

答えて

2

あなたがすることができます。このコードは、クリックボタンの入力にフォーカスを設定することになっています以下を使用してください:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div *ngFor="let item of [1,2,3,4]; let i = index"> 
     <button type="button" (click)="display(i)">Click to show and set focus</button> 
     <input #theInput *ngIf="show === i" type="text" > 
    </div> 
    `, 
}) 
export class App { 
    show = -1; 

    @ViewChild('theInput') 
    private theInput; 

    constructor() { 
    } 

    display(i) { 
    this.show = i; 
    setTimeout(() => this.theInput.nativeElement.focus(), 0); 
    } 
} 

のsetTimeoutの使用よりもよりエレガントなものがあるかどうかはわからないんだけど、入力のみ、showの変更によってトリガーされる変化検出後にDOMに追加されているのでtheInputです未定義(または以前に表示された入力)になります。

デモ:http://plnkr.co/edit/A0ZO0hyuR61nUdiSvzFj?p=preview

編集:AfterViewChecked:

export class App { 
    show = -1; 
    shouldFocus = false; 

    @ViewChild('theInput') 
    private theInput; 

    constructor() { 
    } 

    display(i) { 
    this.show = i; 
    this.shouldFocus = true; 
    } 

    ngAfterViewChecked() { 
    if (this.shouldFocus) { 
     this.theInput.nativeElement.focus(); 
     this.shouldFocus = false; 
    } 
    } 
} 

更新のデモを参照してください:http://plnkr.co/edit/lXTRDGLKwkAAukEQGQjq?p=preview

+1

を私がアクセスを持っていない

それは、よりエレガントなものがある判明どんなiOSブラウザでも、私は実験できません。申し訳ありません。既に見える入力に焦点を合わせて、それが機能するかどうかを確認してください。その後、タイムアウトを増やしてみてください。 'this.theInput.nativeElement'の値を表示して、正しく挿入されているかどうか確認してください。 –

+1

私の同僚はよりエレガントな方法を見つけました。多分iOSの問題を修正するだろう。編集された答えを参照してください。 –

+0

ここでの解決策は良いです - https://stackoverflow.com/questions/34522306/focus-on-newly-added-input-element 特に、レンダラでディレクティブを使用して、アクセスするのではなくフォーカスを適用することを提案する最新のものnativeElementを直接呼び出します。ディレクティブを使用すると、カスタム入力を指定し、常に入力されているようなbrute forceメソッドのようなngAfterViewCheckedを使用するのではなく、変更の入力を監視することができます。 – diopside

関連する問題