Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用CombineTest刷新列表:Angular2+;RxJS_Javascript_Angular_Typescript_Rxjs_Combinelatest - Fatal编程技术网

Javascript 使用CombineTest刷新列表:Angular2+;RxJS

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$

我有一个组件,其中显示了从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
                    })
            });
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()中发出一些东西-我不希望它实际工作,我认为它启动得太早了。