【问题标题】:Angular2: How to have @Input setters called in certain order?Angular2:如何以特定顺序调用@Input setter?
【发布时间】:2017-07-10 13:19:54
【问题描述】:

我正在创建一个组件。因为我喜欢 Apache Wicket 的做事方式,所以我试图模仿 IModel 传递数据的方式。为此,我向子组件传递了一个模型和回调,它们可以提取相关值,而不是调用函数来预先获取数据。

问题是,新设置模型的处理使用回调。 因此,如果在设置回调之前调用模型设置器,Angular 会崩溃。
解决方法:将需要回调的操作推迟到 ngAfterViewInit() 或类似的地方。

简而言之:

  • 如何控制@Inputs 的设置顺序?
  • 我可以依赖源代码中的顺序吗?

示例:(在这里更改顺序似乎可以完成工作)

@Input()
valueCallback: (item: any) => string
    = app => { throw new Error("valueCallback not yet defined."); };

@Input()
labelCallback: (item: ItemType) => string;

使用该子组件的模板:(此处更改顺序不会更改顺序)

            <wu-checkboxes [groupName]="'includedApps'"
                           [options]="availableApps"
                           [valueCallback]="appsValueCallback"
                           [labelCallback]="appsLabelCallback"
            >

正如我上面提到的,Angular2 似乎遵循@Input 类成员的顺序并按该顺序设置/调用它们。问题是,这是事实上的还是法律上的?我不想仅仅因为它目前是这样编码的,就依赖那些可以工作的功能。我对 JavaScript 反射知之甚少,所以我不知道这是否适用于任何地方。

【问题讨论】:

  • 你应该使用ngOnInit。它完全符合您的需要:文档说“在 Angular 首先显示数据绑定属性并设置指令/组件的输入属性之后调用。在第一个 ngOnChanges() 之后调用一次。”见angular.io/guide/lifecycle-hooks#lifecycle-sequence

标签: angular typescript components angular2-custom-component


【解决方案1】:

您可以使用ngOnChanges(),每次更改检测更新@Input() 时都会调用它。您可以在ngOnChanges 中检查所有输入值是否已经可用,然后执行您的代码。 不过,您需要注意自己,后续更新不会再次触发函数调用(以防万一)。

更新

绑定的顺序(值绑定和事件绑定)在 Angular2 中是未定义的,因此您不能依赖特定的顺序。

【讨论】:

  • 感谢您的提示。这就是我所说的“ngAfterViewInit() 或类似”的方法,并且希望避免。它需要相当多的样板代码,而且恐怕很容易出错。
  • 输入没有指定的顺序,因此您不太可能避免。
  • 听起来不错。把它放在答案中怎么样,我会接受
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
相关资源
最近更新 更多