Angular2指令:如何检测DOM变化

22

我希望将Skrollr作为Angular2的属性指令来实现。

因此,格式可能是:

<body my-skrollr>
</body>
然而,为了实现这一点,我需要能够检测包含标签(在本例中为<body>)下方子元素的DOM更改,以便我可以调用skrollr.init().refresh();并更新库以适应新内容。
有没有简单直接的方法可以做到这一点,如果有,请告诉我,否则我的方法是否正确?
1个回答

36

Angular没有提供内置的工具来实现这个目的。您可以使用MutationObserver来检测DOM更改。

@Directive({
  selector: '[my-skrollr]',
  ...
})
class MyComponent {
  constructor(private elRef:ElementRef) {}

  ngAfterViewInit() {
    this.observer = new MutationObserver(mutations => {
      mutations.forEach(function(mutation) {
        console.log(mutation.type);
      });   
    });
    var config = { attributes: true, childList: true, characterData: true };

    this.observer.observe(this.elRef.nativeElement, config);
  }
}

在 MutationObserver 构造函数中,应该使用 "mutations" 而不是 "mutation"。 - Anton Nikiforov
也许您可以检查在特定时间内是否没有发出任何突变事件? - Günter Zöchbauer
2
不要忘记在 ngOnDestroy() 方法内调用 this.observer.disconnect(); - Carlo Bos
使用ElementRef.nativeElement安全吗?我认为这会对应用程序造成XSS风险。 - coder101
2
只要您不将用户生成的内容(直接或间接地)附加到DOM中,使用nativeElement与XSS无关。在Angular 2开发的开始阶段,访问nativeElement是不被赞同的,因为它与服务器端渲染和Web Worker不兼容,但它们并没有被广泛使用,只有少数需要注意。据我所记得,当前状态是传递nativeElement现在与SSR / WW兼容,但访问方法或属性则不兼容。 - Günter Zöchbauer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接