如何通过角度参数获得单个Observable?

时间:2017-06-21 06:30:54

标签: angular rxjs observable

我正在尝试将switchMap与模板async管道结合使用,因此我认为我需要返回Observable。但这不起作用。

this.route.params.switchMap( (params: Params) => 
  this.course = this.courseService.get(params['id'])
);

我在模板中想到了

<div *ngif="course | async as c">
  {{c.name}}
</div>

应订阅此observable并触发对服务器的请求,但似乎没有。我在这里误解了什么?对ngFor数组Observable采用相同的方法。

解决了这个问题,(仍然混淆了switchMap在这里所做的事情,我从某个地方偷了它):

this.route.params.subscribe( params => this.course = this.courseService.get(params['id']));

任何人都可以解释,为什么switchMap在这种情况下不起作用。

在我的其他项目中,这有效:

this.route.params
      .switchMap((params: Params) => 
         this.journalService.getJournal(+params['id']))
      .subscribe( (journal) => {
        this.journal = journal;
      });

2 个答案:

答案 0 :(得分:1)

问题来自switchMap

switchMap期望收到一个可观察但是你没有返回一个可观察的:this.course = this.courseService.get(params['id'])

您可以尝试这样做:

this.course$ = this.route.params
  .map(params => params['id'])
  .switchMap(id => this.courseService.get(id));

<div *ngIf="course$ | async as c">
  {{c.name}}
</div>

答案 1 :(得分:0)

这是blog对您有帮助。根据这篇博客:

  

可观察物是热的还是冷的

     

如果这个普通的Observable没有订阅者,它就不会被触发!   据说observable很冷,因为如果不存在订阅,它就不会生成新的值。

switchMap是一个运算符,应该用于转换来自流的数据。您可以在official site上学习所有rxjs概念。

  

运算符:是纯函数,它支持使用map,filter,concat,flatMap等操作处理集合的函数式编程风格。

希望能有所帮助。