来自服务的Angular 2触发组件方法

时间:2017-05-12 20:05:14

标签: angular angular-services angular-components

我有两个组件(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中的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

就如何做到这一点而言,我认为这将归结为尝试获取对您的根组件的引用,然后通过它的子进程,直到找到您正在寻找的组件。我不知道怎么做,或者甚至可能,因为我的实际答案是:

我认为你不想这样做。

让组件从您的服务订阅一个observable是非常标准且易于遵循的行为,即使它只获得一个变量。您可以查看组件并查看触发其所有输入和输出的确切内容。如果您使服务能够伸出援手并以程序化方式调整您的组件,我认为从长远来看很容易忘记这一事实并且难以追踪行为。你基本上已经从两个负责系统行为的人(组件1和组件2)变成了三个负责人:组件1,组件2和服务1。

IMO要让服务成为简单的数据容器,让组件自己决定何时/如何/在何处更改以响应不断变化的状态,这样做会好得多。

答案 1 :(得分:1)

您通常希望将服务逻辑与用法分开 我的建议是在服务中保存Subject(或BehaviorSubject,具体取决于服务的使用情况),
并且parent组件nextchild组件将订阅Observable(每个Subject都是可观察的,您可以使用{{1返回时请确保您不在API中提供Subject.toObservable

我有一个很好的例子可以说明。

我目前正在开发一个项目,其Subject接收来自canvas的键盘输入,而且,我在同一页面上聊天。在修复之前,我要向您解释,每当我在聊天中按下任何window时,它都会使画布接收输入(有效地移动角色)。

我想做的是,每当我在聊天中时拦截输入。

我有一个名为GameInputDisableService的服务,负责拦截。它会保存WASD,初始化为BehaviorSubject

我有falseTSHTML),我在TS中注入服务,并在输入{{1}中调用服务方法}和MessageInputComponent事件。

另一方面,我有focusTS),其中有一个focusout,这个组件包裹了这个组件transfers the value saved in GameInputDisableService to the AioGameComponent

我希望这适合你,听起来这种服务可以帮到你 不同之处在于您可能希望订阅observable并调用您的compnent方法,而不是将AioGameComponent中的值传递给子组件