如果我不使用超时,Angular 2焦点不起作用

时间:2016-03-02 16:01:56

标签: angular

正如你可以看到我正在使用setTimeout,如果我打算集中我的输入。 如果我删除setTimeout焦点不起作用。

  <div [hidden]="searchInputHidden">
        <input (blur)="hideInput()" #term (keyup)="search(term.value)" type="text" class="inp_top" name="product_name" id="product_name" />
  </div>  


private showSearchInput(term) {
    this.searchInputHidden = false;
    setTimeout(function(){
      term.focus();
    }, 100);
  }

2 个答案:

答案 0 :(得分:20)

超时是必需的,因为您不能focus()仍然隐藏的元素。在Angular更改检测有机会运行之前(将在方法showSearchInput()完成执行之后),即使您将hidden设置为{,也不会更新DOM中的searchInputHidden属性你方法中的{1}}。

值为0的false(或没有值,默认值为0)应该有效。您只需在Angular有机会更新setTimeout()属性值后设置焦点。

请注意,在hidden回调函数完成执行后,更改检测将再次运行(因为Angular monkey-patches在Angular区域中调用所有setTimeout()个调用)。由于我们在异步回调函数中唯一改变的是焦点,我们可以更高效并在Angular区域外运行我们的回调函数,以避免额外的更改检测周期:

setTimeout()

请注意,您必须将NgZone注入构造函数中才能使上述代码正常工作:

private showSearchInput(term) {
  this.searchInputHidden = false;
  this._ngZone.runOutsideAngular(() => { 
    setTimeout(() => term.focus());
  });
}

答案 1 :(得分:-2)

也许你可以尝试这样的事情:

<div class="row col-md-12" [hidden]="messagehide">
{{_result.msgDesc}}
</div>
`this.messagehide=false;
 this.messagealert();   
 messagealert(){
 setTimeout(function() {
 this.messagehide=true;          
 },3000);
 }`

My settimeout function also didn't work . let me know.