【发布时间】:2017-11-03 14:41:55
【问题描述】:
我已经使用 Angular 2/4 大约一年了,我不断回到这个困境,是否将路由器注入服务是否可以被视为一种不好的做法?
这是更多的架构问题。我相信没有确切的答案,但我想听听你的意见。所以这里有两个例子。
- 考虑下一个代码。想象一下,我们有一些组件,我们想在某些操作后将用户重定向到特定的路线,例如用户添加了一个新实体,我们希望将他重定向回网格。
component.ts
constructor(private router: Router) {}
someAction() {
// Some code here
this.router.navigate(['/grid']);
}
这里我觉得用Router就很好了,因为Router和Component都是UI层。
- 现在假设我们有
auth.service.ts,它负责身份验证。我们希望能够将用户从应用程序中注销,我们有logout()函数可以做到这一点。
auth.service.ts
constructor(private router: Router) {}
logout() {
// Cleanup token, storage, etc.
this.router.navigate(['/login']);
}
所以从架构上思考:
- 您如何看待服务内的这种路由器使用情况?
- 您认为这是一种有效的方法吗?
- 如果不是,在这种情况下您有什么建议?
我正在考虑将 eventEmitter 放在 authService 上并在 app.component.ts 中订阅它,但仍然不确定它是否比在服务中更好。
对于这种情况,我很感激任何 cmets。非常感谢!
编辑
另一个例子:UI 是一个带有任务的日历。
有一项服务可以处理所有数据流并为日历提供数据。日历本身并不要求提供数据,而是从服务订阅数据更改。
现在我需要将用户路由到与此日历不同的屏幕。想象一下用户在下周/月/年点击。
此数据存储在路由 URL 中,因此用户可以在页面刷新后停留在同一天,但日历组件不知道天/周/月。
它们被封装在服务中。那么在这种情况下你会使用路由器吗?
【问题讨论】:
-
关于您的最后一个示例,用户如何访问事件详细信息或从日历导航?询问互动
-
在我的例子中,他点击了这一天并希望获得这一天的具体细分。在组件内部,我在服务上调用
fetchDay()。所以基本上我要求服务获取数据但同时我需要将用户重定向到下一个屏幕,但要计算路线我需要来自服务的封装数据:) -
您可以在订阅中完成这项工作吗?在 fetchDay() 上,这里的故事是,给定页面呈现您的日历,该日历在调用服务以获取数据的组件中具有初始化逻辑,一旦数据已成功处理,您始终可以从组件路由日历。
-
是的,我相信。这正是两难境地。在组件中订阅和重定向或从服务重定向。我想我会做第一个变种。在我看来,它在架构上仍然更正确。感谢您的意见!
-
最好从组件中进行,因为您可以看到活动部件在哪里,无论在服务中是否可以完成,但很难识别,因为您总是会先检查组件。
标签: angular