【问题标题】:Angular cannot use async pipe with my observablesAngular 不能将异步管道与我的 observable 一起使用
【发布时间】:2021-02-02 15:02:04
【问题描述】:

我想在我的模板中使用异步管道,但是从我的 api 获取数据时遇到问题。 我已经使用了受下一个数据影响的行为,然后将其保存在可观察的范围内。当我在 html 中调用 observable 时,出现此错误:

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to
Iterables such as Arrays

friendList.ts

  public friendSubject = new BehaviorSubject<any>(null);
  public friend$: Observable<any> = this.friendSubject.asObservable();


 getFriendList(userID: string) {
    userID = this.userID;
    try {
      return this.mainService.getFriendList(userID).subscribe((friendList) => {
        console.log(friendList)
        this.friendSubject.next(friendList);

        // friendList.data.forEach((friend => {
        // }))

        console.log(this.friendSubject)

      })
    }
    catch (err) {

    }
  }

friendList.html

  <ion-label class="friend-count" *ngIf="friend$ | async">{{(friend$ | async)?.length}}</ion-label> 
//this works..
   
            <div class="friend-list">
              <div *ngFor="let i = index; let friend of friend$ | async" class="friend">               
                  <div class="custom-img">
                    <ion-img class="friend-img" [src]="friend?.frendsView.photo"></ion-img>
                  </div>   
                  <ion-label></ion-label>             
    
              </div>

            </div>

我真的很想了解为什么它不起作用

【问题讨论】:

  • 是否可以提供一个最小的可重现示例,例如 StackBlitz?您的评论“这有效......”是什么意思?如果你用括号括起来(friend$ | async) 有什么不同吗?
  • 尝试如下 *ngFor="let user of friend | async as friend; index as i"
  • 异步管道正在工作,问题是您的 friend$ Observable 不是 Observable&lt;any[]&gt; 类型,即您的 Observable 不返回数组而是返回一个对象。
  • 是的,我的 observables 返回对象.. 我该如何转换它?

标签: angular typescript


【解决方案1】:

如果您需要将 BehaviorSubject 与异步管道一起使用,这将对您有所帮助。 https://angular.io/api/common/AsyncPipe

你的组件:

friend$: Observable<[]> = [];

getFriendList(userId: string) {
  this.friend$ = this.mainService.getLastFriend(+userId).pipe(
    catchError(error => of(error))
  );
}

您的主要服务:

private friendSubject = new BehaviorSubject<[]>(null);
private users = [
    {
        userId: 1,
        name: 'Max',
        friendList: {
          {id: 1, name: 'Bob'}, 
          {id: 2, name: 'Alex'},
          {id: 3, name: 'Kate'}
        }
    }
];

getLastFriend(userId: number): Observable<[]> {
  const friendList = this.getFriendList(userId);
  this.friendSubject.next(friendList);

  return this.friendSubject.asObservable();
}  

private getFriendList(userId: number): [] {
  return of(users).pipe(
    filter( ({userId}) => userId === userId),
    map(user => user.friendList)
  );
} 

【讨论】:

  • 有一个问题,在我的代码中,参数'userId'用于获取指定ID的所有朋友,而不是过滤朋友,他们已经被过滤了。我只需要显示它们并将它们存储在一个可观察的..你能帮我重新制作这个短代码吗?
  • 先生,我仍然无法使用我的 get 请求 xd.. 我必须正确映射我的对象,然后我得到 observables 数组的错误.. 有没有办法简化一切?我只需要数据,没有什么特别的,不能只是一个函数吗?
  • 好的,这个(对象数组)怎么样:return this.mainService.getFriendList(userID).pipe( map(friendList =&gt; [friendList]), tap(friendList =&gt; this.friendSubject.next(friendList))).subscribe()
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2016-11-04
  • 2020-03-26
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多