为什么 Angular 中的 ngOnInit 方法中有未定义的元素

Why undefined elements inside ngOnInit method in Angular

我正在我的 ngOnInit 方法中初始化一个库,如下所示:

ngOnInit() {
this.$grid = jQuery('.grid').masonry({
  // options
  itemSelector: '.grid-item',//,
  columnWidth: 384,
  gutter: 24
});
......
}

然后我也在 ngOnInit 内部从那个实例调用这个方法:

 // bind event listener
this.$grid.on( 'layoutComplete',function onLayout() {
  console.log(this.$grid);     
} );

所以它的方法最终看起来像这样:

ngOnInit() {
this.$grid = jQuery('.grid').masonry({
  // options
  itemSelector: '.grid-item',//,
  columnWidth: 384,
  gutter: 24
});

 // bind event listener
this.$grid.on( 'layoutComplete',function onLayout() {
  console.log(this.$grid);     
} );

}

但我不明白为什么 console.log 打印的结果是未定义的,如果实际上是 this.$grid 谁在调用 console.log.

我需要在该方法中再次使用该实例来执行如下操作:

// bind event listener
this.$grid.on( 'layoutComplete',function onLayout() {
  this.$grid.masonry('layout');
} );

但我不能,因为 this.$grid 在该方法中未定义,这对我来说根本没有意义。

有什么想法吗?

尝试在 AfterViewInit 回调生命周期内调用这些。

ngAfterViewInit(): void {
  this.$grid = jQuery('.grid').masonry({
  itemSelector: '.grid-item',
  columnWidth: 384,
  gutter: 24
 });
 this.$grid.on( 'layoutComplete',() => {
  console.log(this.$grid);     
 });
}

ngAfterViewInit(): Respond after Angular initializes the component's views and child views. Called once after the first ngAfterContentChecked(). A component-only hook.

请参阅 angular 文档 https://angular.io/guide/lifecycle-hooks

这是因为您绑定事件的方式。

在您的代码中,this 指的是您传递给 on 函数(例如它本身)的匿名函数的执行上下文。

如果您想保留 this 的上下文,您必须使用这样的 arrow function

this.$grid.on( 'layoutComplete', () => {
    this.$grid.masonry('layout');
});