Angular 6更新可观察

Fra*_*bia 1 observable rxjs typescript angular

嗨,我是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);
 } 
Run Code Online (Sandbox Code Playgroud)

小智 5

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

contacts$ = new BehaviorSubject([]);
Run Code Online (Sandbox Code Playgroud)

这将创建一个您可以订阅和收听的代理(可观察+观察者)。

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

getContacts() {
  this.http.get(url).subscribe(contacts => this.contacts$.next(contacts));
}
Run Code Online (Sandbox Code Playgroud)

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

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));
}
Run Code Online (Sandbox Code Playgroud)

通过此操作,您可以创建一个新联系人并将其添加到现有联系人列表中。

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

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

在第二篇中,我开始获取联系人列表并收听单个事件(即,将来的呼叫contacts$.next不会对该订阅产生任何影响)。然后,我请求创建联系人,完成后,我将创建一个包含先前联系人以及新联系人的新数据源,然后发出一个事件。

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

现在您已经具备了基础知识,我将让您处理更新和删除,因为我不是在这里为您编写代码!

而且,如果您对此代码有任何疑问,那么我建议您阅读文档并制作一些有关RxJS的教程,因为它确实非常强大,并且几乎总是将其与Angular一起使用。