te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - How to properly wait for the template to update in Angular 2 - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to properly wait for the template to update in Angular 2 - Stack Overflow

programmeradmin3浏览0评论

I'm trying to understand the best approach to wait for the template to update in an Angular 2 application after the model has changed.

@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();
      });
   }
}

Using setTimeout in the above code seems hacky, so I'd like to know if there's a better approach.

Thanks!

I'm trying to understand the best approach to wait for the template to update in an Angular 2 application after the model has changed.

@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();
      });
   }
}

Using setTimeout in the above code seems hacky, so I'd like to know if there's a better approach.

Thanks!

Share Improve this question asked Oct 16, 2016 at 16:17 ChristopherChristopher 1051 silver badge4 bronze badges 1
  • Look into Animations... – Sasxa Commented Oct 16, 2016 at 16:23
Add a ment  | 

2 Answers 2

Reset to default 10

There is no way to wait for the template to update.

You can inject ChangeDetectorRef

constructor(private cdRef:ChangeDetectorRef) {}

and then call

this.cdRef.detectChanges();

As far as I know the template is updated when the call returns.

Use [hidden] instead of ngIf. NgIf removes element. That's the reason this.eleInput.nativeElement.focus(); doesn't work without setTimeout because this.eleInput.nativeElement.focus(); line runs immediately before DOM element is/bees set for the further reference.
When [hidden] property doesn't remove DOM element. It just shows and hides an element. So DOM element reference will be there and you nativeElement won't be undefined. So, it will work.

<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.
   }
}
发布评论

评论列表(0)

  1. 暂无评论