【问题标题】:How to pass an object from parent component to children components in angular2?如何将对象从父组件传递给angular2中的子组件?
【发布时间】:2016-05-10 19:45:59
【问题描述】:

假设我有 3 个 Angular 组件,第一个组件使用第二个和第三个组件作为指令。它们应该共享相同的模型对象,该对象在第一个组件中初始化。如何将该模型传递给第二个和第三个组件?我提到了这篇文章How to pass object from one component to another in Angular 2?,但它正在使用输入......我想知道在各种子组件之间共享模型对象的所有可能替代方案 有人请告诉我我可以遵循的替代方案

【问题讨论】:

    标签: angular


    【解决方案1】:

    将该类型添加到First 组件的提供者列表中,并将其注入到First 的构造函数、涉及的子构造函数和孙构造函数中。

    @Component({
      ...
      providers: [SharedService]
    })
    export class First {
      constructor(private shared: SharedService);
      // also add this parameter to the other child and grand-child 
      // component and directives constructors and they will get
      // passed a shared instance.
    }
    

    不要将SharedService 添加到这些子或孙providers 中,否则他们将获得一个新实例而不是共享实例。

    如果您将SharedService 添加到bootstrap(AppComponent, [SharedService]) 而不是父组件,则整个应用程序共享接缝SharedService 实例,而不仅仅是选定的子树。

    【讨论】:

    • 谢谢...我想这个是使用依赖注入吧?
    • 是的,由 Angular 实例化的组件、指令和服务由 DI 实例化,并得到构造函数参数解析和实例化并由 DI 传递。
    • 我已经阅读了您提供的链接...我已经实现了一个 plunker 演示 plnkr.co/edit/IK95wH5amHBBnQ6K09b0?p=preview 这是我需要使用 DI 传递对象的方式吗?
    • 我对全局状态反复有同样的想法。正如您所提到的,您可以通过添加提供者的位置将范围限制为子树。您还可以通过服务类的类型来限制范围。我并不完全满意,但也不算太糟糕。这对于可测试性来说是一个很大的优势。总的来说,我认为这是一个很好的妥协,我也不知道如何做得更好;-)
    【解决方案2】:

    在子项(而不是共享服务)上使用输入属性的一个优点是 Angular 更改检测会自动将更改传播给子项。如果您使用不可变对象并且想要更改整个模型(更改为新的实例/引用),这将特别有用。

    使用服务,您可以更改模型,但不能更改模型引用。

    使用输入属性,您可以执行以下任一操作:更改模型和/或更改模型引用。

    有关使用不可变数据建模​​的更多信息,请参阅以下 Savkin 博客文章:http://victorsavkin.com/post/133936129316/angular-immutability-and-encapsulation

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2016-12-16
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多