使用 combineLatest 刷新列表:Angular2 + RxJS
Refreshing list using combineLatest: Angular2 + RxJS
我有一个组件,我在其中显示从对 API 的 http 请求生成的 table 数据(用户)。 table 上有多种过滤器,所以我生成 table 数据如下:
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
})
});
xFilter$
s 是 BehaviorSubjects,它们发出新值以响应模板中输入的变化。 users$
分配如下:
this.users$ = this.userService.getList();
其中 getList()
returns 获取用户列表的 http 请求。
只要更改过滤器,列表就会成功更新,但是当我需要用新用户更新列表时遇到问题。例如,一个用户可以对table个用户进行CRUD操作(即删除一个用户)。但是,删除用户后,table 不会更新以反映此更改。我目前用来(尝试)刷新 table 的方法是在删除操作的成功回调中调用刷新函数:
refreshUserList() {
console.log("Refreshing user list");
this.users$ = this.userService.getList();
}
尽管在操作完成后调用此方法,但 combineLatest 可观察对象不会再次获得 'triggered',并且列表数据仍然陈旧。有没有更好的方法来刷新 combineLatest 生成的数据与 http 请求?
主要问题是,在用户列表更新的情况下,您的 users$ 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();
我还不能发表评论,所以我会写在这里,如果我错了或者这是不可能的,我会纠正我。如果您在成功删除时使用 .splice()
来更新 DOM 而不是发送另一个 http 请求,那不是更容易并且对客户端的压力更小吗?
我有一个组件,我在其中显示从对 API 的 http 请求生成的 table 数据(用户)。 table 上有多种过滤器,所以我生成 table 数据如下:
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
})
});
xFilter$
s 是 BehaviorSubjects,它们发出新值以响应模板中输入的变化。 users$
分配如下:
this.users$ = this.userService.getList();
其中 getList()
returns 获取用户列表的 http 请求。
只要更改过滤器,列表就会成功更新,但是当我需要用新用户更新列表时遇到问题。例如,一个用户可以对table个用户进行CRUD操作(即删除一个用户)。但是,删除用户后,table 不会更新以反映此更改。我目前用来(尝试)刷新 table 的方法是在删除操作的成功回调中调用刷新函数:
refreshUserList() {
console.log("Refreshing user list");
this.users$ = this.userService.getList();
}
尽管在操作完成后调用此方法,但 combineLatest 可观察对象不会再次获得 'triggered',并且列表数据仍然陈旧。有没有更好的方法来刷新 combineLatest 生成的数据与 http 请求?
主要问题是,在用户列表更新的情况下,您的 users$ 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();
我还不能发表评论,所以我会写在这里,如果我错了或者这是不可能的,我会纠正我。如果您在成功删除时使用 .splice()
来更新 DOM 而不是发送另一个 http 请求,那不是更容易并且对客户端的压力更小吗?