angular - 如何将对象添加到数组的可观察对象

标签 angular angular6 subject-observer

我有一个名为 BookService 的服务的 Angular 项目。

private books: Subject<Book[]>;

getBookList(skip:number = 0,limit:number = 0): Subject<Book[]> {
  return this.books;
}

addBookToList(book:Book) {
}

此服务帮助我监视书籍列表中的更改,我还希望能够使用 addBookToList 函数将一本书添加到列表中,但我不知道如何添加一本书 this observable(主题观察者)
可以加单本书吗

最佳答案

一个主题是一种可观察的。因此,它是一个流。您可以将一个项目(例如一本书)添加到流中,该项目将被广播给流的任何观察者。

但是,它不像普通数组。一旦项目被添加到流和广播,它将不再在主题的“列表”中访问。它只能在订阅此主题的组件中访问。

向主题流中添加内容:

 this.books.next(book);

这会将其添加到流中并将其广播给所有现有订阅者。

如果您想保留书籍的“缓存”,请考虑将书籍定义为一个简单的数组而不是主题。

这是我的一项服务的示例:
export class MovieService {
  private movies: Movie[];

  private selectedMovieSource = new Subject<Movie | null>();
  selectedMovieChanges$ = this.selectedMovieSource.asObservable();

  constructor(private http: HttpClient) { }

  changeSelectedMovie(selectedMovie: Movie | null): void {
    this.selectedMovieSource.next(selectedMovie);
  }

  // more code here
}

请注意,我的电影是一个包含我的电影“缓存”的实际数组。主题设置为单独的属性。

你可以在这里看到我的完整示例:https://github.com/DeborahK/MovieHunter-communication/tree/master/MH-4

查看 movie.service.ts 和调用它的电影组件。

更新:

另一种选择是改用 BehaviorSubject它保持了你的主题的值(value)并且可以在任何时候被引用:
private books: BehaviourSubject<Book[]> = new BehaviorSubject<Book[]>([]);

getBookList(skip:number = 0,limit:number = 0): BehaviorSubject<Book[]> {
  return this.books;
}

addBookToList(book:Book) {
  // apply the current value of your books Subject to a local variable
  let myBooks = this.books.getValue();
  // push that book into your copy's array
  myBooks.push(book);
  // apply the local updated array value as your new array of books Subject
  this.books.next(myBooks);
}

请注意,这每次都会将整个书籍数组添加到流中。

关于angular - 如何将对象添加到数组的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864642/

相关文章:

angular - Angular 4 中的 Bootstrap 轮播错误

Angular/RxJS 6 : How to prevent duplicate HTTP requests?

angular6 - 如何在 Angular 6 中使用 geohash

Angular2,RxJS主题http请求 - 错误请求不会再次触发

rxjs - 一旦 Observable 的监听引发错误,Angular 2 Subject.next 就无法工作

html - 如何使用 Angular 6 中的类名更改背景颜色?

angular - 从不同的组件 Angular 关闭 Material 对话框

typescript - 带有 TypeScript 的 AngularJS 2 中使用的括号和特殊字符

angular - 使用 .NET core 2 为 Angular 6 启用 SSR

javascript - Angular 4 RxJs Observable Subjects 数组未使用新对象更新