在Angular中,使用lambda表达式时,directive的ngOnChanges方法不会被自动调用。这是因为lambda表达式会创建一个新的函数实例,而不是原始的方法实例,导致Angular无法检测到属性的变化。
为了解决这个问题,可以使用bind方法将lambda表达式绑定到正确的上下文。这样,directive的ngOnChanges方法就能够正常工作。
以下是一个示例代码,演示了如何在Angular 6中使用bind方法来解决这个问题:
import { Directive, Input, OnChanges, SimpleChanges } from '@angular/core';
@Directive({
selector: '[myDirective]'
})
export class MyDirective implements OnChanges {
@Input() myInput: string;
ngOnChanges(changes: SimpleChanges) {
console.log('ngOnChanges called');
if (changes.myInput) {
console.log('myInput changed:', changes.myInput.currentValue);
}
}
}
@Component({
selector: 'my-component',
template: ''
})
export class MyComponent {
myProperty: string = 'initial value';
constructor() {
// 使用bind方法将lambda表达式绑定到正确的上下文
this.myPropertyChange = this.myPropertyChange.bind(this);
}
// 使用bind方法将lambda表达式绑定到正确的上下文
myPropertyChange = (newValue: string) => {
console.log('myProperty changed:', newValue);
}
}
在这个示例中,MyDirective是一个自定义指令,它具有一个名为myInput的输入属性,并实现了OnChanges接口。在ngOnChanges方法中,我们输出了属性的变化。
MyComponent是一个使用了自定义指令的组件。它有一个名为myProperty的属性,并将其绑定到了自定义指令的输入属性上。在myPropertyChange方法中,我们输出了属性的变化。
通过在构造函数中使用bind方法将lambda表达式绑定到正确的上下文,我们确保了directive的ngOnChanges方法能够正常工作。
请注意,这个解决方法也适用于Angular 7及更高版本。