Angular 6 更新 Observable

标签 angular typescript rxjs observable

您好,我是 Angular 6 的新手,经过多次研究后无法正常工作。 我有一个来自 jsonplaceholder.typecode.com 的列表,因为我已经阅读了它的文档,所以我可以发布、删除和更新,但是如何在执行这些方法时让我的列表异步更改。

这是我的服务方法

getContacts(){
return this.contact = 
 this.http.get('https://jsonplaceholder.typicode.com/users');
}

getUser(id){
 return this.http.get('https://jsonplaceholder.typicode.com/users/'+id);
}

addContact(newContact: Contact){
 return this.http.post('https://jsonplaceholder.typicode.com/users', 
newContact);
 }

 removeContact(contact){
  return 
 this.http.delete('https://jsonplaceholder.typicode.com/users/'+contact.id);
}

updateContact(contac: Contact){
return 
this.http.put('https://jsonplaceholder.typicode.com/users/'+contac.id, 
 contac);
 } 

最佳答案

首先在您的服务中创建一个 BehaviorSubject:

contacts$ = new BehaviorSubject([]);

这会创建一个您可以订阅和收听的代理(Observable + Observer)。

现在我们有了它,让我们填充它:

getContacts() {
  this.http.get(url).subscribe(contacts => this.contacts$.next(contacts));
}

使用此代码,您可以获得联系人列表并将其推送到您的代理中。

addContact(newContact: Contact){
  this.contacts$.pipe(
    take(1),
    switchMap(contacts => this.http.post(url, newContact).pipe(
      map(() => [...contacts, newContact])
    )),
  ).subscribe(contacts => this.contacts$.next(contacts));
}

使用这个,您可以创建一个新联系人并将其附加到现有联系人列表中。

通过创建代理,您创建了一个数据源,您可以通过 HTTP 调用处理该数据源。

例如,在第一个方法中,我发出一个值,它是联系人数组。每个监听器(即您编写的任何地方 this.myService.contacts$.subscribe)都将收到此值。

在第二个中,我开始获取联系人列表并收听单个事件(即以后调用 contacts$.next 不会对此订阅执行任何操作)。然后,我请求创建联系人,完成后,我创建一个包含以前的联系人和新联系人的新数据源,然后发出一个事件。

这不是很清楚,学习起来似乎很累人,但是一旦你会用它,它就会变得非常强大。

现在您已经掌握了基础知识,我将让您处理更新和删除,因为我不是来为您编写代码的!

如果你对这段代码有任何问题,那么我建议你阅读文档并制作一些关于 RxJS 的教程,因为真的,它非常强大,你几乎总是将它与 Angular 一起使用。

关于Angular 6 更新 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281032/

相关文章:

angular - 如何用新的 observable 替换 http observable?

javascript - Angular 4和Nodejs http post请求实现错误

angular - Ngrx-data 选择单个实体

javascript - Visual Studio 在 TypeScript 中显示错误的 `this` 值

javascript - 如何获取 RxJS Subject 或 Observable 的当前值?

javascript - RXJS if with observable 作为条件

javascript - 使用rxjs,如何将每个元素映射到多个元素

javascript - 使用可观察函数更新模板的元素

javascript - 使用 TypeScript 和 Browserify 如何更简单地导入和使用类

node.js - 反转 : contextual injection with class name