Javascript 使用CombineTest刷新列表:Angular2+;RxJS
我有一个组件,其中显示了从http请求到API生成的数据表(用户)。表上有多种过滤器,因此我生成表数据如下:Javascript 使用CombineTest刷新列表:Angular2+;RxJS,javascript,angular,typescript,rxjs,combinelatest,Javascript,Angular,Typescript,Rxjs,Combinelatest,我有一个组件,其中显示了从http请求到API生成的数据表(用户)。表上有多种过滤器,因此我生成表数据如下: this.displayUsers$ = Observable.combineLatest( this.users$, this.siteFilter$, this.clientFilter$, this.activeFilter$, this.nameFilter$
this.displayUsers$ = Observable.combineLatest(
this.users$,
this.siteFilter$,
this.clientFilter$,
this.activeFilter$,
this.nameFilter$
)
.map(([users, siteFilter, clientFilter, activeFilter, nameFilter]) => {
console.log("Users changed? ", users);
if (siteFilter === null
&& clientFilter === null
&& activeFilter === null
&& nameFilter.length < 1) {
return users;
}
return users
.filter(user => {
// manipulate users array based on filters
})
});
this.users$ = this.userService.getList();
其中getList()
返回获取用户列表的http请求
每当过滤器更改时,列表都会成功更新,但当需要使用新用户更新列表时,我遇到了问题。例如,用户可以对用户表执行CRUD操作(即删除用户)。但是,删除用户后,表不会更新以反映此更改。我当前用于(尝试)刷新表的方法是在删除操作的成功回调中调用刷新函数:
refreshUserList() {
console.log("Refreshing user list");
this.users$ = this.userService.getList();
}
尽管在操作完成后调用此函数,但CombineTest observable不会再次“触发”,列表数据仍然过时。是否有更好的方法刷新CombineTest与http请求生成的数据?主要问题是,在用户列表更新的情况下,用户$observable不会发出任何新值。你必须让它这样做 这是一个解决方案的框架:
const updateUsersTrigger = new Subject<void>();
this.displayUsers$ = Observable.combineLatest(
// switchMap() will re-subscribe to this.userService.getList() observable on each emit from updateUsersTrigger
// thus making http requests each time when user list should be updated.
updateUsersTrigger.startWith(null).switchMap(() => this.userService.getList()),
this.siteFilter$,
this.clientFilter$,
this.activeFilter$,
this.nameFilter$
)
.map(([users, siteFilter, clientFilter, activeFilter, nameFilter]) => {
.......
});
// this will trigger user list update
updateUsersTrigger.next();
const updateUsersTrigger=新主题();
this.displayUsers$=Observable.CombineTest(
//switchMap()将重新订阅此.userService.getList(),该值可在每次从updateUsersTrigger发出时观察到
//因此,每次应该更新用户列表时都会发出http请求。
updateUsersTrigger.startWith(null).switchMap(()=>this.userService.getList()),
此.siteFilter$,
此.clientFilter$,
此.activeFilter$,
这是我的名字过滤器$
)
.map(([users、siteFilter、clientFilter、activeFilter、nameFilter])=>{
.......
});
//这将触发用户列表更新
updateUsersTrigger.next();
主要问题是,在用户列表更新的情况下,用户$observable不会发出任何新值。你必须让它这样做
这是一个解决方案的框架:
const updateUsersTrigger = new Subject<void>();
this.displayUsers$ = Observable.combineLatest(
// switchMap() will re-subscribe to this.userService.getList() observable on each emit from updateUsersTrigger
// thus making http requests each time when user list should be updated.
updateUsersTrigger.startWith(null).switchMap(() => this.userService.getList()),
this.siteFilter$,
this.clientFilter$,
this.activeFilter$,
this.nameFilter$
)
.map(([users, siteFilter, clientFilter, activeFilter, nameFilter]) => {
.......
});
// this will trigger user list update
updateUsersTrigger.next();
const updateUsersTrigger=新主题();
this.displayUsers$=Observable.CombineTest(
//switchMap()将重新订阅此.userService.getList(),该值可在每次从updateUsersTrigger发出时观察到
//因此,每次应该更新用户列表时都会发出http请求。
updateUsersTrigger.startWith(null).switchMap(()=>this.userService.getList()),
此.siteFilter$,
此.clientFilter$,
此.activeFilter$,
这是我的名字过滤器$
)
.map(([users、siteFilter、clientFilter、activeFilter、nameFilter])=>{
.......
});
//这将触发用户列表更新
updateUsersTrigger.next();
我还不能发表评论,所以如果我错了或者这是不可能的,我会在这里写信纠正我。如果您在成功删除时使用.splice()
来更新DOM,而不是发送另一个http请求,这对客户端来说不是更容易、更省力吗?我还不能发表评论,所以如果我错了或者这是不可能的,我将在这里写下并纠正我。如果您在成功删除时使用.splice()
来更新DOM,而不是发送另一个http请求,这对客户端来说不是更容易、更省力吗?无论哪种方式,OP都需要一些可观察的对象来发出新数组,无论是http请求还是splice()都会导致一些可观察的.map()或者别的什么。无论哪种方式,OP都需要一些可观察的来发出新的数组,无论是http请求还是splice()结果,都会产生一些可观察的.map()或其他东西。这很有意义,谢谢你的建议。然而,我认为我的实现缺少了一些东西,因为现在我没有得到任何表数据(即使我更改了过滤器)。我更改了refreshUserList(){updateUsersTrigger.next();}并在ngOnInit()中调用它,但仍然不走运。@natmegs,尝试类似这样的操作:updateUsersTrigger.startWith(null).switchMap(()=>…调用服务…
而不是在ngOnInit()中发出一些东西-我不希望它实际工作,我认为发射太早了。这很有道理,谢谢你的建议。然而,我认为我的实现缺少了一些东西,因为现在我没有得到任何表数据(即使我更改了过滤器)。我更改了refreshUserList(){updateUsersTrigger.next();}并在ngOnInit()中调用它,但仍然不走运。@natmegs,尝试类似这样的操作:updateUsersTrigger.startWith(null).switchMap(()=>…调用服务…
而不是在ngOnInit()中发出一些东西-我不希望它实际工作,我认为它启动得太早了。