2017-09-05 7 views
2

は、私は、デフォルトでは隠されているテキストエリアが含まれているコンポーネントがあります。ViewChildとフォーカス()

@ViewChild('myname') input: ElementRef; 
... 
private toggleEditable(): void { 
    this.whyModel.toggleEditable(); 
    this.input.nativeElement.focus(); 
} 

「ショー」部分は機能していますが、フォーカス部分は機能していません。何が欠けていますか?

答えて

2

バインディングは、変更検出が実行されるときにのみ更新されます。通常、イベントハンドラが完了した後です。これは、イベントハンドラ自体がすでに変更検出の効果に依存しているため、ユースケースに遅れることになります。

あなたはAfterViewCheckでフォーカスすることができますまた、「力」detectChanges()

constructor(private cdRef:ChangeDetectorRef) {} 

@ViewChild('myname') input: ElementRef; 
... 
private toggleEditable(): void { 
    this.whyModel.toggleEditable(); 
    this.cdRef.detectChanges(); 
    this.input.nativeElement.focus(); 
} 
+0

[OK]を、これが働いているが、私はよく分かりません理解する。あなたが "バインディング"と言うとき、あなたはviewChildについて話しますか?私は、隠されたfunctionnalityを使用しました。なぜなら、viewChildは、隠されたDOMエレメントにのみバインドできると思っていたからです。これはそうではありませんか?あなたが言うことは、viewChildは、自分の要素が隠されなくなった後にしか利用できないということですか? – Lempkin

+0

'[hidden] ="!whyModel.inEdition "は' this.whyModel.toggleEditable(); 'の効果に依存し、隠された要素に焦点を当てることは機能しません(チェックされておらず、覚えていない)それが真実ならば、なんて推測しました;-)) –

+0

ああ、私はあなたが今何を意味するかを見ます:) – Lempkin

0

を呼び出すことによって、(同期的)すぐに変化検出を強制することができます。私は、デモの目的のために、あなたのコードを簡素化:

活字体:

editable; 

    @ViewChild('myname') input: ElementRef; 
    private toggleEditable(): void { 
     this.editable = !this.editable; 
    } 

    ngAfterViewChecked(){ 
    if(this.editable){ 
      this.input.nativeElement.focus(); 
    } 
    } 

HTML

<div class="action ui-g-2" (click)="toggleEditable()">edit</div> 
<br> 
<textarea [hidden]="!editable" #myname id="textBox_{{id}}" pInputTextarea 
    focus="true" [(ngModel)]="description"></textarea> 

Stackblitz example

関連する問題