如何检测@put()值在角度上的变化?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我大部分的工作都很好,即每个组件都可以访问jsonAPI,并通过可观测数据获取其相关数据。

当前,视频列表组件只获取所有视频,我希望将其过滤为特定类别中的视频,通过以下方式实现这一点@Input()

L.5 oryComponent.html

<video-list *ngIf="category" [categoryId]="category.id"></video-list>

这是可行的,当父目录类Component类别发生更改时,将会通过@Input()但是,我需要在VideoListComponent中检测到这一点,并通过APIService重新请求视频数组(使用新的类别ID)。

处理这件事的最好方法是什么?

提问于
用户回答回答于

实际上,在angular2+中,当子组件中的输入发生变化时,有两种检测和处理方法:

  1. 可以使用ngOnChanges()生命周期方法正如以前的答复所提到的那样
  2. 或者,您也可以使用输入属性设置器详情如下: 私_PortoryID:String;@Input()SET CROSTORYID(值:String){this。_objecoryID=value;this.doSomething(如下。_;}get GonzoryID():String{返回此。_类别ID;}

你应该使用哪种方法?

如果您的组件有几个输入,那么如果使用ngOnChanges(),那么您将在ngOnChanges()中一次获得所有输入的所有更改。使用这种方法,您还可以比较当前和以前的值的输入已经改变,并采取相应的行动。

但是,如果您只想在特定的单个输入更改(而且您不关心其他输入)时执行某些操作,那么使用InputPropertysetter可能会更简单。但是,这种方法没有提供一种内置的方式来比较更改后的输入的先前值和当前值(这可以很容易地使用ngOnChanges生命周期方法)。

编辑2017-07-25:在某些情况下,角度变化检测仍可能不会开火。

通常,每当父组件更改传递给子组件的数据时,setter和ngOnChanges的更改检测都会触发,如果数据是JS基元数据类型(字符串、数字、布尔值)但是,在以下情况下,它不会触发,您必须采取额外的行动,以使它的工作。

  1. 如果使用嵌套对象或数组(而不是JS原始数据类型)将数据从父级传递到子级,则更改检测(使用setter或ngchange)可能不会触发,这一点在user:muetzerich的回答中也提到过
  2. 如果在角度上下文之外(即外部)变异数据,那么角将不知道这些变化。可能必须在组件中使用ChangeDetectorRef或Ngzone,以便从角度上了解外部变化,从而触发更改检测。
用户回答回答于

使用ngOnChanges()组件中的生命周期方法。

ngOnChanges是在数据绑定属性被选中之后调用的,如果其中至少有一个已经更改,则在检查视图和内容子元素之前调用ngOnChanges。

扫码关注云+社区