gpt4 book ai didi

javascript - 使用combineLatest刷新列表: Angular2 + RxJS

转载 作者:行者123 更新时间:2023-12-01 02:56:31 25 4
gpt4 key购买 nike

我有一个组件,在其中显示从对 API 的 http 请求生成的数据(用户)表。表上有多种过滤器,所以我生成表数据如下:

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$ 是BehaviorSubjects,它们发出新值以响应模板中输入的更改。 users$ 的分配如下:

this.users$ = this.userService.getList();

其中 getList() 返回一个 http 请求以获取用户列表。

每当更改过滤器时,列表都会成功更新,但当我需要使用新用户更新列表时,我会遇到问题。例如,用户可以对用户表执行CRUD操作(即删除用户)。但是,当删除用户时,表不会更新以反射(reflect)此更改。我当前使用(尝试)刷新表的方法是在删除操作的成功回调中调用刷新函数:

refreshUserList() {
console.log("Refreshing user list");
this.users$ = this.userService.getList();
}

尽管在操作完成后调用此函数,combineLatest observable 不会再次“触发”,并且列表数据仍然陈旧。有没有更好的方法通过http请求刷新combineLatest生成的数据?

最佳答案

主要问题是,在用户列表更新的情况下,您的 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();

关于javascript - 使用combineLatest刷新列表: Angular2 + RxJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com