0

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

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
                    })
            });

s 是 BehaviorSubjects ,xFilter$它们发出新值以响应模板中对其输入的更改。users$分配如下:

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

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

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

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

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

4

2 回答 2

2

主要问题是,在用户列表更新的情况下,您的 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();
于 2017-10-10T19:22:40.430 回答
1

我还不能发表评论,所以如果我错了或者这是不可能的,我会在这里写信并纠正我。如果您使用.splice()on successful delete 来更新 DOM 而不是发送另一个 http 请求,那不是更容易并且对客户端的压力更小吗?

于 2017-10-10T19:32:37.403 回答