我有一个指令,上面有一个@Input,它接受一个课程.

@Directive({selector: 'my-directive'})
@View({directives: [CORE_DIRECTIVES]})
export class MyDirective  {
    @Input() inputSettings : SettingsClass;
    @Input() count : number;

   onChanges(map) {
      console.log('onChanges');
    }
}

该指令用于html:

  ...
  <my-directive [input-settings]="settings" [count]="settings.count"></my-directive>
  ...

如果settings.count被更改,则onChanges将触发.如果设置类上的任何其他属性发生更改,则不会触发.

如何检测设置中的任何属性是否发生了更改?

推荐答案

Angular 仅会注意到对象是否已更改为其他对象(即,对象引用已更改),因此ngOnChanges()不能用于解决您的问题.有关详细信息,请参见Victor Savkin's blog post.

可以在MyDirective类中实现ngDoCheck()方法.该生命周期钩子被称为"每次判断组件或指令的输入属性时.使用它通过执行自定义判断来扩展更改检测."

要实现自定义判断方法,首先需要在类SettingsClass上实现.equals()方法,这样就可以在ngDoCheck()中编写如下代码:

ngDoCheck() {
   if(!this.inputSettings.equals(this.previousInputSettings)) {
      // inputSettings changed
      // some logic here to react to the change
      this.previousInputSettings = this.inputSettings;
   }
}

Angular相关问答推荐

我使用Ngrx的子集 Select 器不起作用

Angular前端调用ALB身份验证后的后端并重定向

Ionic 5角形共享两个模块之间的组件

如何使用解析器处理Angular 路由中存储的查询参数以避免任何额外的导航?

如何确保[共享]组件是真正的哑组件?(Angular )

如何在Primeng中实现自定义排序

列表和映射的SCSS语法

当包含react 性模板绑定时,NG-Bootstrap手风琴不会打开

如何修复不允许的HttpErrorResponse 405?

根据环境变量动态加载Angular templateUrl

需要做什么才能使 ErrorHandler 正常工作?

无法推送 Angular 项目 - Github

为什么 HttpParams 在 Angular 4.3 中的多行中不起作用

带有嵌套表单数组的 Angular react式表单

如何在 ngFor 循环中创建变量?

如何在angular material中使用输入类型文件

Angular 4.3拦截器不起作用

Angularmaterial步进器:禁用标题导航

使用 Angular 2 新路由更改页面标题

Angular 6在输入键上添加输入