首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套可观测角2

嵌套可观测角2
EN

Stack Overflow用户
提问于 2016-01-07 09:18:32
回答 2查看 8.8K关注 0票数 9

我正在试用角2的http GET来检索HackerNews上的顶级文章列表,然后我将在嵌套可观察的范围内检索它们各自的详细信息。

当我试图循环并在HTML中显示数据时,我会遇到这个错误。

找不到不同的支持对象“对象”

另外,我猜应该有更好的方法来做这个,有指针吗?

代码语言:javascript
复制
getTopPost() {
    this.http.get('https://hacker-news.firebaseio.com/v0/topstories.json')
      .map(res => res.json())
      .subscribe(
        data => { 
                    data.map(function(postId){
                            let storyUrl = "https://hacker-news.firebaseio.com/v0/item/"+ postId +".json";
                            that.http.get(storyUrl)
                                .map(res => res.json())
                                .subscribe(data => that.hnData = data, 
                                           err => that.logError(err),
                                           () => console.log(that.hnData));

                        });

                },
        err => this.logError(err);
      );

  }

HTML

代码语言:javascript
复制
<ion-item *ngFor="#item of hnData">
        {{item.title}}
</ion-item> 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-07 18:01:53

我不认为这是一个很好的做法是嵌套观察到的xhr电话..。但我不是这方面的专家,也不能告诉您为什么会有这个异常(可能是关于这个that var..)。

但我有一种不同的方法要告诉你:

第一个组件<top-stories>加载id列表,然后为每个组件生成其他组件<top-story>

代码语言:javascript
复制
@Component({
  selector: 'top-stories',
  providers: [],
  template: '
    <div>
      <h2>Hacker news top stories:</h2>
      <ul>
        <li top-story *ngFor="#story; #i = index of list | async" [num]="i+1" [id]="story"></li>
      </ul>
    </div>
  ',
  directives: [TopStory]
})
export class TopStories {
  list: Observable<Array<number>>;

  constructor(private http: Http) {
    this.list = this.http.get('https://hacker-news.firebaseio.com/v0/topstories.json')
    .map(res => res.json())
    .map(list => list.slice(0, 30));
  }
}

组件<top-story>加载自己的post详细信息并显示它:

代码语言:javascript
复制
@Component({
  selector: '[top-story]',
  providers: [],
  template: `
    <div>
      <a *ngIf="item" [href]="item?.url">{{ num + ': ' + item?.title }}</a>
      <span *ngIf="!item">loading...</span>
    </div>
  `,
  directives: []
})
export class TopStory implements OnInit, OnDestroy {
  @Input() num: Number;
  @Input() id: Number;

  sub: any;
  item: object;

  constructor(private http: Http) {}

  ngOnInit() {
    this.sub = this.http.get('https://hacker-news.firebaseio.com/v0/item/' + this.id + '.json')
    .map(res => res.json())
    .subscribe(item => this.item = item);
  }

  ngOnDestroy() {
    this.sub.unsubscribe();
  }
}

您可以在下面的柱塞中使用它:http://plnkr.co/edit/BRMlyD?p=preview

票数 5
EN

Stack Overflow用户

发布于 2016-01-08 16:51:06

我想你可以用一种更简单的方式重写它,像这样:

代码语言:javascript
复制
getTopPost() {
  return http.get('https://hacker-news.firebaseio.com/v0/topstories.json')
    .map(res => res.json())
    .mergeMap(list => Observable.fromArray(list))
    .mergeMap(postId => http.get("https://hacker-news.firebaseio.com/v0/item/"+ postId +".json"))
    .map(res => res.json())
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34651304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档