当前位置: 首页 > 知识库问答 >
问题:

如何利用可观测的角度ngFor

濮阳宏硕
2023-03-14

book定义为:

class Book {
   id: number;
   name: string;
   constructor(id: number, name: string) { 
     this.id = id;
     this.name = name;
  }
}

我继续创建observable对象books$:

const book1: Book = new Book(1, "Title 1");
const book2: Book = new Book(2, "Title 2");
function booklist(observer) {
  observer.next(book1);
  observer.next(book2);
  observer.complete();
  return {unsubscribe() {}};
}
this.books$ = new Observable(booklist);

使用以下工具进行检查:

this.books$.subscribe(each => console.log(each));

打印:

Book {id: 1, name: "Title 1"}
Book {id: 2, name: "Title 2"} 

但是在html模板中使用ngfor可以观察到:

<ul>
  <li *ngFor="let book of books$ | async" >
    Id: {{book.id}}, Name: {{book.name}}
  </li>
</ul>

引发错误:

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

如何解决这个问题?这里是Stackblitz项目的链接:

https://stackblitz.com/edit/Angular-ivy-isebs7?file=src%2fapp%2fapp.component.ts

共有1个答案

公西嘉玉
2023-03-14

除了books$表示一个对象流,而不是数组之外,所有东西看起来都很好。因此可能必须使用keyvalue管道。请尝试以下操作

html prettyprint-override"><ul>
  <ng-container *ngIf="(books$ | async) as books">
    <li *ngFor="let book of books | keyvalue" >
      {{book.key}}: {{book.value}}
    </li>
  </ng-container>
</ul>

但是,上述解决方案只打印当前通知。如果您希望收集每个通知并显示所有通知,可以使用RxJSbuffercount(如果您不确定通知的数量,则使用buffer)运算符收集所有通知。

控制器

import { bufferCount } from 'rxjs/operators';  

ngOnInit(): void {
  ...
  this.books$ = <Observable<Book[]>>(new Observable(booklist).pipe(bufferCount(2)));
  this.books$.subscribe(each => console.log(each));
}

模板

<ul>
  <ng-container *ngFor="let books of books$ | async">
    <li *ngFor="let book of books | keyvalue" >
      {{book.key}}: {{book.value}}
    </li>
  </ng-container>
</ul>

我修改了你的Stackblitz

 类似资料:
  • 我有一个HTTP请求,希望将结果共享给多个组件。当然,HTTP请求返回一个可观察的。我希望多个组件能够订阅此服务,而不会触发额外的HTTP请求。 我在一个组件中使用实现了这一点,该组件按需发出HTTP请求,并有另一种方法订阅该主题。虽然这是可行的,但似乎有些过分,而且肯定有更好的方法。 主题服务 和一个订户 和第二个订户 从管道链中删除时,会发出多个网络请求。是否有一种更优雅/正确的方式将观察到的

  • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

  • 学习角得到服务和组件和可观察性。 我正在尝试在我的演示应用程序中实现暗模式。该控件由一个服务完成,该服务根据浏览器默认值(如果找到)设置暗主题。 它在应用程序组件中初始化,以便以后在应用程序中放置控制开关。 暗模式从布尔值开始工作,因此为true或false。据我所知,使用一个可观察对象是不够的,因为我希望多个订阅者都以两种方式绑定到订阅,每种方式在服务中切换这些可观察对象。到目前为止,我很肯定这

  • 我有一个带有http请求的服务,它返回我的标题的可观察到的内容 servise.ts 在我的组件中,我有一个函数从service get Request设置。看起来是这样的: 问题是,有时我接收到带有空标签的标题,不需要显示它们,所以我需要对其进行过滤,并对此标题发送.delete()请求。我尝试了类似的方法(想法是在之前添加,然后在另一个subscribe内部调用。)差不多吧 但不确定这是不是个

  • 我想清除/deStory可观察到的是在服务中创建的。我看到一些帖子说也可以在服务中使用。 但是,这是一个好的做法和唯一的方式这样做,什么时候会被调用?请有人澄清一下。

  • 我有一个沙盒,它订阅了一个消息流,我想过滤该流,以查找已发送到或从特定用户使用另一个组件中指定的路由参数接收的消息。 messages.sandbox.ts: messages.detail.container.ts this.matching消息$似乎只包括this.received消息$但是我知道this.sent消息$不是空,因为我可以在我的模板中使用它没有问题。 我是不是遗漏了一些合并观测