我有两个组件(one.component和two.component)之间的关系,我在两者之间有一个服务(global.service)。一切都运作良好(我可以从Angular.io网站的Angular 2 - Parent and children communicate via a service中将值从一个传递到另一个)。我在global.service中有一个从one.component中删除的全局变量,当发生这种情况时,我需要在two.component中触发even。我认为,当发生这种情况时,我可以通过observable将global.service中的布尔变量传递给two.component。但是,因为我不需要变量,所以我认为必须有更好的方法来调用global.service中的two.component中的方法。
谢谢!
答案 0 :(得分:1)
就如何做到这一点而言,我认为这将归结为尝试获取对您的根组件的引用,然后通过它的子进程,直到找到您正在寻找的组件。我不知道怎么做,或者甚至可能,因为我的实际答案是:
我认为你不想这样做。
让组件从您的服务订阅一个observable是非常标准且易于遵循的行为,即使它只获得一个变量。您可以查看组件并查看触发其所有输入和输出的确切内容。如果您使服务能够伸出援手并以程序化方式调整您的组件,我认为从长远来看很容易忘记这一事实并且难以追踪行为。你基本上已经从两个负责系统行为的人(组件1和组件2)变成了三个负责人:组件1,组件2和服务1。
IMO要让服务成为简单的数据容器,让组件自己决定何时/如何/在何处更改以响应不断变化的状态,这样做会好得多。
答案 1 :(得分:1)
您通常希望将服务逻辑与用法分开
我的建议是在服务中保存Subject
(或BehaviorSubject
,具体取决于服务的使用情况),
并且parent
组件next
,child
组件将订阅Observable
(每个Subject
都是可观察的,您可以使用{{1返回时请确保您不在API中提供Subject.toObservable
。
我目前正在开发一个项目,其Subject
接收来自canvas
的键盘输入,而且,我在同一页面上聊天。在修复之前,我要向您解释,每当我在聊天中按下任何window
时,它都会使画布接收输入(有效地移动角色)。
我想做的是,每当我在聊天中时拦截输入。
我有一个名为GameInputDisableService的服务,负责拦截。它会保存WASD
,初始化为BehaviorSubject
。
我有false
(TS,HTML),我在TS中注入服务,并在输入{{1}中调用服务方法}和MessageInputComponent
事件。
另一方面,我有focus
(TS),其中有一个focusout
,这个组件包裹了这个组件transfers the value saved in GameInputDisableService
to the AioGameComponent
我希望这适合你,听起来这种服务可以帮到你
不同之处在于您可能希望订阅observable并调用您的compnent方法,而不是将AioGameComponent
中的值传递给子组件