如何在angular2中从Observable中选择特定记录

Sun*_*arg 2 observable angular

这是我的角色类

export class Role {
    id: number;
    name: string;

    constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有 roles

roles: Observable<Role[]>;
Run Code Online (Sandbox Code Playgroud)

我正在填满

this.roles = this.roleService.getAllRoles();
Run Code Online (Sandbox Code Playgroud)

现在我想根据id. 为此,我正在使用

let selectedRole = this.roles.filter(role => role.id === group.role)
                               .map(role=> {console.log(role)});
Run Code Online (Sandbox Code Playgroud)

但这并没有记录任何内容:(。我错过了什么吗?我刚刚开始使用 Angular2

AJT*_*T82 5

您的 observableroles是一个数组项。它不是该数组中项目的可观察对象,因此role.id在您尝试过滤时不存在。您需要遍历此数组才能提取值:

let selectedRole = this.roles.map(arr => 
                      { return arr.filter(role => role.id == group.role) })
Run Code Online (Sandbox Code Playgroud)

有了这个,你最终selected会得到一个可以作为数组的 observable 。有点不确定你想要一个项目还是几个项目......但是如果你只需要一个项目,find而是使用,那么你最终不会得到一个类似数组的 observable,而是一个像 observable 这样的对象。

let selectedRole = this.roles.map(arr => 
                      { return arr.find(role => role.id == group.role) })
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!:)

至于是否有点不清楚是否要使用 observables。如果您不想使用 observables,只需自己订阅然后过滤值:

this.roleService.getAllRoles()
  .subscribe(data => {
     this.roles = data;
     // create an array with roles that match the group role
     this.selectedRole = this.roles.filter(x => x.id == group.role)
     // find a single role that matches the group.role
     this.selectedRole = this.roles.find(x => x.id == group.role)
  })
Run Code Online (Sandbox Code Playgroud)