【问题标题】:Is it possible to pass data after initializing the components?初始化组件后是否可以传递数据?
【发布时间】:2021-03-21 12:33:58
【问题描述】:

我有三个组件,如下图所示,并在我的功能组件中使用自定义表单组件。但是,这两个组件之间并没有直接的父子关系,它们之间还有一个表单组件。

我使用@Input 属性将数据从功能传递到表单,该属性在配置数据中具有输入值(比如说“configData”),然后通过@Input 属性将它们传递给自定义组件(比如说“configData.test”用于测试输入)没有任何问题(我可以在初始化自定义组件时传递每个参数)。但是,在初始化之后,当我设置一个可以在初始化时传递的配置值时,自定义控件不会检测到它。我还尝试为该输入使用 setter,如下所示,并等待捕获 ngOnChanges 方法的更改。如果没有直接的父子关系,我不确定是否可以更新该值,但我避免在可重用的自定义组件中使用服务。那么,解决方案是什么?我是否必须 BehaviourSubject 并通过服务传递价值?

custom-component.ts:

private _test: string;
@Input() set test(value: string) {
    this._test = value;
};
get test() { return this._test; }


ngOnChanges(changes: SimpleChanges) {
    console.log(changes);
    console.log(this.test);
}

这是我的组件的结构:

【问题讨论】:

  • 听起来问题可能来自使用配置,然后是 @Input()。第一个关系不使用@Input() 是否有原因?
  • 对不起,我解释错了,它也是通过@Input()在配置中传递的,这意味着从第一个到第二个,从第二个到第三个组件,数据是通过@Input()传递的。那么,初始化组件后如何获取输入值呢?
  • 输入应该在原始值发生变化时更新,所以它本质上应该被传递下去。您是否更改了任何组件上的更改检测策略,b/c 会影响更新如何发生/通过组件。
  • 感谢您的帮助,不,我的任何组件都没有检测策略。这个问题似乎与 Moshezauros 回答的某些观点有关。我想我可以通过遵循这些建议来解决。问候。

标签: javascript angular rxjs components behaviorsubject


【解决方案1】:

如果我理解正确,您的 configData 是一个对象,并且您只更新它的一些属性 - 如果是这种情况,您应该知道只有在更改该对象引用时才会触发 angular。

如果这里确实是这种情况,您可以通过以下方式之一克服它:

  1. 每次要更改时都重新创建 configData 对象 - configData = { ...configData, newProp: newPropValue }; Angular 会理解这是一个新对象并更新相关输入
  2. 您可以添加 DoCheck 生命周期挂钩 - 每次 Angular 运行更改检测时都会运行该挂钩 - 所以请注意这会触发 很多
  3. 传递输入的不可变变量而不是可变变量 - 传递对象的属性而不是将 configData 作为对象传递
  4. 注册一个 observable,每次configData 更改都会触发,然后相应地更新您的组件

【讨论】:

  • 非常有用的建议,非常感谢,投了赞成票。我认为选项 1 似乎适合我。但我不确定如何通过使用扩展运算符等来更新 currentProp 值。您能否将其添加到您的答案中?
  • 另一方面,对于自定义组件,我认为使用选项 4 会更好,但我不确定如何注册 observale。您能否发布一个示例,以便我可以根据this page 上的示例设置mat-autocomplete 值(filteredOptions)。您可以查看该页面上第一个示例的 html 和 ts 文件。
  • @Fredrick 对于选项 4,您必须使用服务,这是一个示例 - stackoverflow.com/questions/56714969/…
  • 非常感谢,看来很有用。但我只是想知道一个问题:在上图中,为了从自定义组件发射到功能组件,我是否需要首先发射到表单组件?然后我是否必须通过触发该方法从第二个组件中的方法发出?我的意思是第一个组件在第二个组件中发出一个方法,然后我将该方法中的事件发送到第三个组件?
  • 另一方面,是否可以使用扩展运算符复制配置中的配置值?还是仅用于向数组添加新元素?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2021-01-20
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多