【发布时间】:2018-05-02 22:51:14
【问题描述】:
我正在尝试从 B_Module 拥有的 B_Component 调用 A_Module 拥有的 A_Component 方法,并且在将 A_Component 作为参数添加到 B_Component 构造函数后立即收到以下错误:
NullInjectorError:没有 A_Component 的提供者!
编辑:这两个组件不是父/子。它们的模块由 app.module 导入
(为简洁起见,代码汇总)
A_Module:
import { A_Component } from '...'
@NgModule({
imports: [...],
declarations: [A_Component],
exports: [A_Component],
})
export class A_Module { }
B_模块:
import { A_Module } from '...'
import { B_Component } from '...'
@NgModule({
imports: [A_Module],
declarations: [B_Component]
})
export class B_Module { }
A_组件:
export class A_Component {
someMethod() {...}
}
B_组件:
import { A_Component } from '...'
export class B_Component {
constructor(public a_Component: A_Component)) {} //this param causes error
callSomeMethod() {
this.a_Component.someMethod();
}
}
这不是如何跨模块调用组件方法吗?做到这一点的唯一方法是使用服务吗?
【问题讨论】:
-
在您使用 B 组件的视图/模板中,a_component 是 B 组件的父级吗? Afaik,如果您将一个组件注入另一个组件,Angular 注入器将通过从子组件被实例化的点沿 DOM 树向上移动来查找该另一个组件。换句话说,它将查看 A_Component 是否是 B 组件的父组件,如果不是,它将查看它是否是其父组件的父组件,依此类推。如果它们在您的视图(DOM)中没有这样的关系,它将不知道如何注入它。分享你使用组件的代码!
-
@diopside 这两个组件不是父子组件。这两个模块都由 app.module 导入。你是对的,我在构造函数中注入组件的唯一其他时间是当组件是子组件的父组件时。我以为我也可以使用非父/子组件来做到这一点。
-
是的,不幸的是,文档并没有使 Angular 的这一部分变得清晰。
-
@Alex Angular 方式是一种共享服务。这是制作每个组件和独立项目的要点,也是编译时优化的一部分。
-
因为这个问题有点关于模块交互。有很酷的文章可以让你更好地理解模块的作用域 - medium.com/@cyrilletuzi/…
标签: angular