【发布时间】:2018-05-23 21:56:38
【问题描述】:
我试图在某个可观察对象开始后立即在按钮中显示一个微调器,并在它结束后再次隐藏它。
经过数小时的研究,我有点迷失了如何实现它(我知道这里有几个帖子,但似乎都没有帮助,甚至经常提到的 angular-2-busy 或其中一个叉子也没有真的好用)
所以会有工作流
我有一个指令/组件,我可以通过@Input 向它提供一个 Observable。 指令应该在 Observable 启动后立即显示微调器(或者我可以只使用 click 事件)。 并且它应该在订阅完成后再次隐藏微调器。
注意:下面的示例是简化的(不涉及微调器等),但确切地显示了问题所在。
export class AppComponent {
name = 'Angular 6';
test: Observable<any>;
constructor(private http: HttpClient) {
const obs = of(true);
this.test = obs.pipe(tap(() => console.log('tap1')), flatMap(() => {
return this.http.get('https://httpbin.org/get');
})
);
}
demo() {
this.test.subscribe((state: any) => console.log(state));
}
}
export class HelloComponent implements OnChanges {
@Input() name: string;
@Input()
obs: Observable<any>;
ngOnChanges(changes: SimpleChanges): void {
if (changes.obs) {
this.obs.pipe(map(() => console.log('component')));
}
}
}
here is the stackblitz 这说明了我试图完成的工作以及它目前不起作用
当我在 hello-component 中调用 subscribe 时,它显然会立即执行每个管道方法,这不是我想要的。
当我不调用 subscribe 时,pipe 运算符会创建一个新的 subscription,它显然永远不会被执行。
所需的行为是控制台中的以下输出。
- “tap1”
- http 调用的结果
- “组件”
我觉得我错过了一些非常明显的东西。 关于如何解决这个问题的任何想法?
【问题讨论】:
-
您可能正在寻找主题吗? reactivex.io/rxjs/manual/overview.html#subject observables 不允许多个订阅,但 Subjects 允许。不过,我不太确定我是否理解您的问题。
标签: javascript angular rxjs