【发布时间】:2018-08-07 14:49:03
【问题描述】:
这是服务 服务实现了两个 EventEmitter
@Injectable()
export class SpinnerService implements HttpInterceptor {
visibility: EventEmitter<boolean> = new EventEmitter(false);
notVisibility: EventEmitter<boolean> = new EventEmitter(false);
constructor() { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
**doesn 't work**
this.visibility.emit(true);
next.handle(request).subscribe(
httpParameter => {
if (httpParameter instanceof HttpResponse) {
this.notVisibility.emit(false);
}
});
return next.handle(request);
}
}
这是组件
export class SpinnerComponent implements OnInit {
visibility: boolean;
ngOnInit() {
this.subscribeToVisibility();
this.subscribeToNotVisibility();
}
constructor(private spinnerService: SpinnerService) { }
private subscribeToVisibility(): void {
this.spinnerService.visibility.subscribe((value: boolean) => {
**should enter here**
this.visibility = value;
});
}
private subscribeToNotVisibility(): void {
this.spinnerService.notVisibility.subscribe((value: boolean) => {
this.visibility = value;
});
}
}
【问题讨论】:
-
对不起代码,请看服务,
-
1.
EventEmitters 专门用于组件@Outputs,在这里只需使用常规的Subject。 2. “不起作用”究竟是什么意思?您确定在这两种情况下都获得了相同的服务实例吗(例如,请参阅我的博客blog.jonrshar.pe/2017/Jul/15/angular-http-client.html,其中我展示了如何将相同的实例用作拦截器和注入服务)? -
对不起,我是一个有角度的初学者,每个服务都没有一个实例?在我老板传递的示例中没有使用@Output,无论如何我尝试过它并不起作用.我怎么知道它是否是同一个实例?
-
我不是说你应该添加
@Output,我是说你应该远离EventEmitter。不,每个服务不一定只有一个实例;如果您的类在模块providers数组中出现两次,您需要小心确保它实际上是同一个实例。阅读那篇文章,见最后的例子。 -
将
EventEmitters 更改为Subjects(并将.emit(...)调用更改为.next(...))。究竟什么“不起作用”?
标签: angular angular6 eventemitter