我已经使用Angular 2/4大约一年了,我一直在回到这个困境,无论是否将路由器注入服务都被认为是一种不好的做法?
这是更具建筑性的问题.我相信没有确切的答案,但我想听听你的意见.所以这里有两个例子.
component.ts
constructor(private router: Router) {}
someAction() {
// Some code here
this.router.navigate(['/grid']);
}
Run Code Online (Sandbox Code Playgroud)
在这里我认为使用Router非常好,因为路由器和组件都是UI层.
auth.service.ts
它并且它负责身份验证.我们希望能够将用户退出应用程序,我们有logout()
能力这样做.auth.service.ts
constructor(private router: Router) {}
logout() {
// Cleanup token, storage, etc.
this.router.navigate(['/login']);
}
Run Code Online (Sandbox Code Playgroud)
所以在架构上思考:
我正在考虑在app.component.ts中eventEmitter
加入authService
并订阅它,但仍然不确定它是否比在服务中使用它更好.
我感谢对此案的任何评论.非常感谢!
编辑
另一个例子:UI是一个包含任务的日历.
有一种服务可以处理所有数据流并为日历提供数据.日历本身不会询问数据,而是订阅服务中的数据更改.
现在我需要将用户路由到此日历的不同屏幕.想象一下,用户点击下周/月/年.
此数据存储在路径URL中,因此用户可以在页面刷新后的同一天停留,但日历组件不知道日期/周/月.
它们包含在服务中.那么在这种情况下你会使用路由器吗?
我正在尝试在ngrx效果中实现可配置的延迟。但是RxJS delay()
函数不能仅接收lambda作为参数number | Date
。我想做的是tap
将有效负载中的值存储到某个全局变量中,然后将其用作参数,delay()
但它不起作用。delay()
似乎是用旧的变量值调用的。这是供参考的代码段:
@Effect()
delayHideRx$ = this.actions$
.ofType(IconsActions.DELAY_HIDE_RX)
.pipe(
tap((action: Action) => { rxDelay = action.payload }),
delay(rxDelay),
map(() => {console.log('delay hide rx'); return IconsActions.hideRx(rxDelay)})
);
Run Code Online (Sandbox Code Playgroud)
基本上,我要实现的是某种setTimeout()
功能,但仅包含操作。
通常,任务听起来像这样:一旦收到来自服务器的推送,我们需要显示一些图标,并在一定时间后将其隐藏。时间量来自服务器。
我将不胜感激有关如何参数化delay()
输入参数的任何建议,以及有关在这种情况下为何延迟采用先前值的任何解释。
谢谢!