运算符过滤器不按从 API 发送的元素进行迭代
Operator Filter not iterate by element sent from API
我正在尝试使用 Angular 7 的运算符过滤器。我有一个用 Express 制作的 api。举个例子很简单。这个APIreturn一个Object数组。像这样:
[
{name: 'Admin'},
{name: 'Invitado'},
{name: 'Ejecutivo'}
]
接下来是API代码:
function listRole(req, res) {
var params = req.params;
var page = 1;
var cant = 10;
if ( params.page ){
page = parseInt(params.page);
}
if ( params.cant ){
cant = parseInt(params.cant);
}
RoleModel.find().paginate(page, cant, (err, roles, total) => {
if ( err ) {
return res.status(500).send({
message: err
});
}
return res.status(200).send(
roles
);
})
}
在 Angular 7 的应用程序中,我有一项服务 return 与参数匹配的角色列表。
我的服务:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
filter( (e: any) => {
console.log(e) // this return an array
return e.name === role;
})
);
}
我订阅这个服务时,数据为空:
this.userService.getRoles('Admin').subscribe( data => {
console.log(data);
});
我的问题是:
为什么运算符过滤器 return 中的值 e 是一个数组?
我想我应该遍历一个数组
感谢任何帮助
找了几个博客找到了解决办法。
FlatMap 运算符将 Observable 发出的项目转换为 Observable,然后将这些发出的项目扁平化为单个 Observable
因此,第一件事是应用此运算符,以便将响应转换为发出元素并可以遍历每个元素的 Observable。解决方案是这样的:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
flatMap( (data) => data ),
filter( (e: any) => {
return e.name === role;
})
);
}
这个解决方案是正确的,但有一个细节。我无法通过元素数组进行迭代,因为 flatMap return 是一个 Observable。也就是说,当我订阅此服务时,我不会通过数组进行迭代,在模板中我无法使用 *ngFor。
这个细节我解决了:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
flatMap( (data) => data ),
filter( (e: any) => {
return e.name === role;
}),
toArray()
);
}
我正在尝试使用 Angular 7 的运算符过滤器。我有一个用 Express 制作的 api。举个例子很简单。这个APIreturn一个Object数组。像这样:
[
{name: 'Admin'},
{name: 'Invitado'},
{name: 'Ejecutivo'}
]
接下来是API代码:
function listRole(req, res) {
var params = req.params;
var page = 1;
var cant = 10;
if ( params.page ){
page = parseInt(params.page);
}
if ( params.cant ){
cant = parseInt(params.cant);
}
RoleModel.find().paginate(page, cant, (err, roles, total) => {
if ( err ) {
return res.status(500).send({
message: err
});
}
return res.status(200).send(
roles
);
})
}
在 Angular 7 的应用程序中,我有一项服务 return 与参数匹配的角色列表。
我的服务:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
filter( (e: any) => {
console.log(e) // this return an array
return e.name === role;
})
);
}
我订阅这个服务时,数据为空:
this.userService.getRoles('Admin').subscribe( data => {
console.log(data);
});
我的问题是: 为什么运算符过滤器 return 中的值 e 是一个数组? 我想我应该遍历一个数组
感谢任何帮助
找了几个博客找到了解决办法。
FlatMap 运算符将 Observable 发出的项目转换为 Observable,然后将这些发出的项目扁平化为单个 Observable
因此,第一件事是应用此运算符,以便将响应转换为发出元素并可以遍历每个元素的 Observable。解决方案是这样的:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
flatMap( (data) => data ),
filter( (e: any) => {
return e.name === role;
})
);
}
这个解决方案是正确的,但有一个细节。我无法通过元素数组进行迭代,因为 flatMap return 是一个 Observable。也就是说,当我订阅此服务时,我不会通过数组进行迭代,在模板中我无法使用 *ngFor。
这个细节我解决了:
getRoles(role: string): Observable<any> {
return this.http.get<any[]>(this.url).pipe(
flatMap( (data) => data ),
filter( (e: any) => {
return e.name === role;
}),
toArray()
);
}