因此,在我的app.Component中,每个页面上都包含标题(在app.module中导入的CoreModule)以及一个根据路由加载模块的app-routing.模块(在本例中为SomeContainerRoutingModule)

问题是,当我try 将Dropdown Component(它是CoreModule的一部分)导入到容器中时,它将主题视为单独的对象,并且不包括在标题中找到的可观察对象.当我从导入中排除CoreModule时,主题可以正常工作,但Dropdown Component不再出现在页面上.

如何在将核心组件添加到页面的同时使用相同的主题/服务?核心模块不应该已经从头所在的根app.组件中导入了吗?

CoreModule

...
declarations: [HeaderComponent, DropdownComponent],
providers: [MessageService]
export class CoreModule {}

SomeContainerRoutingModule

...
imports:[...
//CoreModule
//removing this makes Subject work. Adding it makes the component appear
...

MessageService

export class MessageService {
private subject = new Subject<any>();
sendMessage(message){this.subject.next(message);}
getMessage(){return this.subject.asObservable();}
}

我try 将核心组件添加到容器模块的导入中,但收到错误:类型Dropdown Component是两个模块声明的一部分:CoreModule和SomeContainerRoutingModule!... 我还try 将服务添加到容器模块,但似乎没有任何影响.

推荐答案

您似乎希望您的MessageService在您的应用程序中是单例的.

在这种情况下,最好不要在任何地方提供它,只需在MessageService@Injecable修饰符中添加ProvidedIn:‘根’,如下所示:

@Injectable({
  providedIn: 'root'
})
export class MessageService {
private subject = new Subject<any>();
sendMessage(message){this.subject.next(message);}
getMessage(){return this.subject.asObservable();}
}

然后它将在您的所有组件中提供,并且将是单例的.只需确保从所有模块提供程序数组中删除MessageService(不要在核心模块或其他任何地方提供它).否则,如果您在某个惰性模块(很可能是您的SomeContainerRoutingModule)中提供它,那么该模块将拥有用于该服务的自己的注入器,并且它将创建一个新实例.

下面是关于在angualr:https://angular.io/guide/hierarchical-dependency-injection中依赖项注入如何工作的非常详细的文档

Javascript相关问答推荐

我的glb文件没有加载到我的three.js文件中

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

有条件的悲剧

我应该绑定不影响状态的函数吗?'

如何在Javascript中的控制台上以一行形式打印循环的结果

使用useEffect,axios和useParams进行react测试

MathJax可以导入本地HTML文档使用的JS文件吗?

如何从HTML对话框中检索单选项组的值?

检索相加到点的子项

NG/Express API路由处理程序停止工作

如何将zoom 变换应用到我的d3力有向图?

传递方法VS泛型对象VS事件特定对象

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

构建器模式与参数对象输入

react 路由如何使用从加载器返回的数据

FindByIdAndUpdate在嵌套对象中创建_id

重新渲染过多(&Q).REACT限制渲染次数以防止无限循环.使用REACT下拉菜单时

MAT-TREE更多文本边框对齐问题

将匿名函数附加到链接的onClick属性