【问题标题】:angular 2 listen/detect dom rendered elements from *ngForangular 2 监听/检测来自 *ngFor 的 dom 渲染元素
【发布时间】:2016-11-28 22:45:54
【问题描述】:

当 angular 2 完成渲染从 *ngFor 启动的 dom 元素时,有没有办法检测/监听事件/挂钩?

例如我有这个清单:

<ul>
  <li *ngFor="let item of items">
    <span>{{item.name}}</span>
    <img [src]="item.url">
  </li>
</ul>

项目最初是空的,在 http req 之后填充。完成:

items = [];

ngOnInit(): void {
  console.log('start')
  this.svc.getItems() // http service call
    .subscribe(
      items => {
        this.items = items;
        console.log('done');
      },
      err => this.handleError(err)
    );
}

我需要在“开始”和“完成”之间显示某种加载。我想当它被记录为“完成”时,一切都完成了,但事实并非如此。 *ngFor 渲染元素和获取图像需要一段时间。

那么有没有办法检测 *ngFor 完成并获取图像?

【问题讨论】:

标签: angular typescript


【解决方案1】:

没有钩子。 *ngFor 也总是在 items 更改时更新。

您可以拨打detectChanges

constructor(private cdRef:ChangeDetectorRef) {}

ngOnInit(): void {
  console.log('start')
  this.svc.getItems() // http service call
    .subscribe(
      items => {
        this.items = items;
        console.log('done');
      },
      err => this.handleError(err),
      () => {
         this.cdRef.detectChanges();
         console.log('done')
      }
    );
}

据我所知,这会同步更新 DOM。

对于您的用例,您可以省略 this.cdRef.detectChanges();,因为 Angular2 将在完成回调中调用 console.log('done') 之后立即运行更改检测。

【讨论】:

  • 这种方式首先“完成”被记录,但之后需要一段时间来呈现添加的项目(获取图像)所以如果我隐藏加载器会有时间“间隙”并且用户会看不到图像和没有装载机
  • 您能否尝试注入ApplicationRef 并改为调用它的tick()
  • 完整块?如果是这样,则不会调用此块,因为我在组件和 http 之间的中间服务中使用 BehaviourSubject。但是下一个块被调用了两次......当加载图像时,这很奇怪......
  • 好吧,我的错。在那个带有 BehaviourSubject 的中间 svc 中,我最初下一个空项目..所以现在我看不到添加到组件属性的项目和加载的图像之间有任何延迟。我认为这种延迟可能发生在 inet 连接速度较慢的设备上。
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2017-01-25
  • 2018-11-18
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多