2016-10-16 6 views
2

モデルが変更された後、テンプレートが角2のアプリケーションで更新されるのを待つ最善の方法を理解しようとしています。上記のコードでのsetTimeoutを使用してテンプレートが角2で更新されるのを正しく待機する方法

@Component{ 
    template : `<button type="button" (click)="handleClick()">Click</button> 
       <div *ngIf="!hidden"> 
        <input type='text' #eleInput/> 
       </div>` 
} 
export class Sample{ 
    private hidden: boolean = true; 
    @ViewChild('eleInput') eleInput: ElementRef; 

    constructor(){} 

    handleClick(){ 
     this.hidden = false; 

     //nativeElement is undefined here 
     this.eleInput.nativeElement.focus(); 

     //nativeElement is defined here 
     setTimeout(() => { 
     this.eleInput.nativeElement.focus(); 
     }); 
    } 
} 

はハックと思われるので、私はより良いアプローチがありますかどうかを知りたいのです。

ありがとうございます!

+0

は、[アニメーション](https://angular.io/docs/ts/latest/guide/animations.html#!#example-entering-and-leaving)に見て.. – Sasxa

答えて

4

使用[hidden]代わりのngIfNgIfは要素を削除します。これは、this.eleInput.nativeElement.focus();setTimeoutなしで動作しない理由です。これは、DOM要素が追加の参照用に設定される直前にthis.eleInput.nativeElement.focus();行が実行されるためです。
[hidden]プロパティはDOM要素を削除しません。要素を表示したり隠したりするだけです。したがって、DOM要素の参照はそこにあり、nativeElementは未定義ではありません。それで、うまくいくでしょう。

<div [hidden]="hidden">      //<<<===use hidden instead of *ngIf 
      <input type='text' #eleInput/> 
</div> 

private hidden: boolean = true; 
    @ViewChild('eleInput') eleInput: ElementRef; 

    constructor(){} 

    handleClick(){ 
     this.hidden = false;      
     this.eleInput.nativeElement.focus();  //<<<===now this will work. 
    } 
} 
+1

これは実際にこのシナリオに最適な方法ですが、これを使用します。しかし、setTimeoutなしで* ngIfシナリオを処理する方法があるなら、私はまだ興味があります – Christopher

+0

'* ngIf'はDOM要素を削除し、' this.eleInput.nativeElement.focus() 'はDOM要素の直前で実行されるため、正しく設定されています。ですから、 'setTimeout'がなければそれはできないと思います – micronyks

2

テンプレートが更新されるのを待つ方法はありません。

あなたはChangeDetectorRef

constructor(private cdRef:ChangeDetectorRef) {} 

を注入し、その後、私の知る限り、コールから戻ると、テンプレートが更新される知っているように

this.cdRef.detectChanges(); 

を呼び出すことができます。

関連する問題