无法通过Observable的filter方法筛选条件,提示role属性未定义
问题根源分析
你最初的错误是混淆了RxJS的filter操作符和JavaScript数组的filter方法:
authService.getUsers()返回的Observable发射的是一个完整的用户数组,不是单个用户对象- RxJS的
filter操作符的作用是判断Observable发射的整个值是否符合条件,符合才允许值继续往下流。你用它去检查user.role时,这里的user其实是整个数组,数组没有role属性,所以抛出未定义错误。
可行代码逻辑拆解
this.users$ = this.authService.getUsers().pipe( tap((users: any) => console.log("****** user", users)), map(users => users.filter((user: User) => user.role == "0")) )
逐行解释:
tap操作符:- 属于RxJS的工具类操作符,只执行副作用操作(比如打印日志、调试),不会修改Observable流中的值
- 这里的作用是打印Observable传来的用户数组,方便你确认数据结构,仅用于调试,去掉后不影响筛选逻辑
map操作符:- 作用是转换Observable发射的值:接收上游传来的完整用户数组,返回一个新值
- 这里调用的是JavaScript数组的
filter方法,遍历数组筛选出user.role == "0"的用户,最终返回仅包含目标用户的新数组 - 经过
map转换后,users$这个Observable最终发射的就是筛选好的用户数组,你可以直接用async管道在模板中使用,无需手动订阅
内容的提问来源于stack exchange,提问作者Shanmugam
相关产品推荐
相关产品推荐

