【发布时间】:2017-01-10 23:27:42
【问题描述】:
据我了解,在 Angular 2 中,如果您想在不相关的组件(即不共享路由因此不共享父子关系的组件)之间传递值,您可以通过共享服务。
这就是我在 Angular2 应用程序中设置的内容。我正在检查 url 中是否存在特定系列的字符,如果存在则返回 true。
isRoomRoute(routeUrl) {
if ((routeUrl.includes('staff') || routeUrl.includes('contractors'))) {
console.log('This url: ' + routeUrl + ' is a roomRoute');
return true;
} else {
console.log('This url: ' + routeUrl + ' is NOT a room route');
return false;
}
}
在根app.component的构造函数中,我订阅了路由事件:
constructor(private routeService: RouteService,
private router: Router) {
this.router.events.subscribe((route) => {
let routeUrl = route.url;
this.routeService.sendRoute(routeUrl);
this.routeService.isRoomRoute(routeUrl);
});
}
... 然后使用那些提供的 url 来检查 url 是否包含特定的字符串。每次路线更改时都会对其进行评估。
所以这一切都按预期工作。
但是,我在将该检查的结果传递给不同的、不相关的(非父子)组件时遇到了问题。
即使我在 app.component 和不相关的 (room.component) 组件中都使用了共享服务 (routeService),但在一个组件中有效的功能在另一个组件中无效。据我了解,这里检查的“真实性”应该足以返回一个真实的陈述。
但在次要的、不相关的组件中,当我调用该函数时,我得到一个“未定义”错误,如下所示:
isRoomRoute() {
if (this.routeService.isRoomRoute(this.routeUrl)) {
return true;
}
}
所以这就是我卡住的地方。基本上,关于 url 是否包含某个字符串的评估已经发生。现在我只需要将检查的布尔结果传递给次要的、不相关的组件。我怎样才能在 Angular 2 中做到最好?
【问题讨论】:
-
服务不仅适用于不相关的组件,请参阅angular.io/docs/ts/latest/cookbook/…
-
我明白,但这不是我要说的。我正在解决一个特定的用例,因为它涉及在非父子组件之间传递值。
-
您可以将服务用于任何相关或无关的事情。在一个小型应用程序中,甚至可以只使用一个服务来处理整个应用程序的所有事件发射。我得到一些人可能会说不。
-
好的,但同样,这与我的问题无关。我知道您可以将服务用于许多事情。我没有详尽无遗。我是说在不相关的组件之间传递信息时,您使用服务来执行此操作。
-
其实一般不是这样的。共享服务将像单例一样运行。换句话说,两个组件将共享同一个服务实例。
标签: javascript angular typescript