【问题标题】:Injecting parent component with base class type in angular以角度注入具有基类类型的父组件
【发布时间】:2019-01-01 06:40:07
【问题描述】:

我正在尝试将我的父组件注入到子组件中(我知道,紧密连接)。问题是我有一个继承链,由于某种原因我收到一个错误,即没有提供依赖项。

tl;dr;

我在子组件中注入基类,但出现以下错误: Template parse errors: No provider for BaseClass

export class BaseClass { ... }

@Component({ selector: 'parent-comp' })
export class ParentComponent extends BaseClass {}

@Component({ selector: 'child-comp' })
export class ChildComponent {
    constructor(public parent: BaseClass) {}
}

用法:

<parent-comp>
   <child-comp>

原因

我的ParentComponent 继承了BaseClass 的一些功能,我想在子组件中访问其中的一些功能。 我正在构建一个库,并且有多个从BaseClass 继承的组件。我不知道将使用哪个继承的组件,因为库使用者决定了。

我尝试添加 @Host() 装饰器,但这也不起作用。

根据我对依赖注入(这不是最好的)的理解,这应该有效。我正试图了解这里的原因!

如果有人能对此事有所了解,我将不胜感激!

【问题讨论】:

    标签: angular ionic-framework dependency-injection


    【解决方案1】:

    不幸的是,注入器不支持通过继承来定位组件。它只能找到一个特别命名的组件,即ParentClass

    你可以做的是为你父母的基类创建一个更通用的InjectionToken

    export const BaseClassInjectionToken = new InjectionToken<BaseClass>('BaseClass');
    

    然后在你的父类组件声明中provide它 - providers 属性。

    providers: [{ provide: BaseClassInjectionToken, useExisting: forwardRef(() => ParentComponent) }]
    

    (注意:forwardRef 防止编译时循环引用)。

    然后孩子可以将InjectionToken注入其中。

    constructor(@Inject(BaseClassInjectionToken) private parent: BaseClass) 
    

    【讨论】:

      【解决方案2】:

      如果您希望子组件显示在父组件中,则将该子组件的选择器添加到父组件的 HTML 中。它不是为将一个组件注入另一个组件而设计的。

      如果您有共享功能,请将该功能添加到服务中并使用父级和子级的服务。

      父子之间的通信应该仅限于@input 属性和@output 事件。

      组件的目的是显示用户界面(一些 HTML)。组件内代码的目的是支持该 HTML 的显示。

      使用服务来共享属性/状态或功能/方法。创建自定义指令以共享 UI 逻辑。

      【讨论】:

      • 感谢您的回答!我知道我可以通过服务解决它,但我想了解为什么创建“仅”用于共享财产的服务是更好的做法?我也不明白为什么这不起作用?如果我在服务中有继承链,它会起作用吗?
      • 在大多数情况下,公认的答案是最佳实践,但在某些用例中,将父组件直接注入其子组件是一种完全有效且合理的技术。以 CdkStepper 为例:“父级”CdkStepper 被注入到其每个“子级”CdkStep(s) 中。这允许从子步骤设置父步骤的活动步骤。通常,我们会尽量保持组件的松散耦合,这也是服务如此有用的原因之一。但有时组件旨在紧密耦合,@Inject 也很有帮助!
      • 无论答案的有效性如何,它都不会回答所提出的问题。在某些情况下,问题可能是有效的,回答者不负责判断。因此投反对票。
      • @DanielLeiszen 干得好。你给出了拒绝投票的理由..但是答案呢?震惊地看到一位 Angular 课程的作者投了反对票。我认为这是溢出
      • @CICSolutions AFAIK,CdkStepper 是一个 AbstractControl,而不是一个组件。
      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2016-08-25
      • 2021-06-18
      • 2021-01-25
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多