仅当我从观察者主题接收到的JSON对象的值发生更改时,我才希望订阅可观察对象:
searchedName = '';
filters = {
"page": 1,
"perPage": 10,
"sortOrder": "asc",
"tag": "allUsers",
"sortBy": "firstname"
}
getUsers(e)
{
console.log("searched")
const searchedKeyword = this.searchedName.trim();
if(searchedKeyword !== '')
this.filters['name'] = searchedKeyword
this._service.triggerCallForUsers(this.filters)
}
ngOnInit()
{
//Initially called to load users..
this._service.triggerCallForUsers(this.filters)
//Subscribe to fetch users
this._service.startFetchingUsers$
.distinctUntilChanged()
.subscribe((filters) => {
console.log("filters", filters)
if (filters) {
this._service.getUsersByFilter(filters)
.subscribe(
users => {
console.log('users', users);
},
error => {}
);
}
})
}
其中的过滤器是:
这可能吗?
尝试解决以下问题:
.distinctUntilChanged((a, b) => {
console.log('compare', b['name'], a['name'], b['name'] === a['name']);
return a === b
})
//首次订阅时 输出:-没有可供比较的输出
///当我添加's'searchedName字段时,即发送到 next()将包含
filters ['name']
输出:-比较s undefined false
//如果将searchedName更改为“ sd”:
输出:-比较sd sd true。
更新:
<input type="text" (keyUp.enter)="getUsers($event)" [(ngModel)]="searchedName">
服务:
在使用中,我在可观察到的位置调用next():
private startFetchingUsers = new BehaviorSubject < any > (null);
startFetchingUsers$ = this.startFetchingUsers.asObservable();
triggerCallForCareGroup(filter) {
this.startFetchingUsers .next(filter);
}
答案 0 :(得分:1)
如果您需要深度平等,请尝试使用lodash中的isEqual
。
在subscribe
中您也有太多逻辑-考虑将do
/tap
用于副作用,并将mergeMap
用于合并其他Observable。
import { isEqual } from 'lodash';
this._service.startFetchingUsers$
.distinctUntilChanged(isEqual)
.do(filters => console.log("filters", filters))
.mergeMap(filters => this._service.getUsersByFilter(filters))
.do(users => console.log('users', users))
.subscribe({
error(error) {
console.error(error);
},
});
当我在过滤器json中更改名称参数时,更新后的值a ['name']和b ['name']相同。
这表明您的代码中的其他地方也可能存在问题。您可以在调用startFetchingUsers.next(newFilters)
的地方共享代码吗?
更新
您正在突变this.filters
对象,因此您不会看到更改,因为a === b
始终成立。对象本身是相同的!像这样使用浅表副本:this._service.triggerCallForUsers({ ...this.filters })