2

考虑系统中所有用户的列表:

  allUsers = {
    a: {name:'Adam',email:'adam@testco.com',level:'admin',group:'Owners'},
    b: {name:'Barbra',email:'Barbra@testco.com',level:'admin',group:'Owners'},
    c: {name:'Chris',email:'Chris@otherplace.net',level:'standard',group:'Managers'},
    d: {name:'Dennis',email:'dsmolek@showman.com',level:'standard',group:'Managers'},
    e: {name:'Elizabeth',email:'eadams@testco.com',level:'standard',group:'Staff'},
    f: {name:'fred',email:'fred@testco.com',level:'visitor',group:'Visitor'},

  }

然后是项目中的用户列表:

usersList = ['a','b','d','f'];

所以你有一个很好的简单函数来获取用户 ID 并查找其余的用户详细信息:

  getUser(userId){
    console.log('Getting User with Id:', userId);
    if(allUsers[userId]) return allUsers[userId];
  }

然后在模板中使用 *ngFor 循环遍历列表中的用户,但您想查找完整的详细信息集

<tr *ngFor="#userId in usersList" #user="getUser(userId)">
  <td>{{user.name}}</td>
</tr>

不起作用...如果不创建自定义组件或其他更复杂的东西,我无法弄清楚如何为每个用户运行一次 getUser 函数。我当然可以一遍又一遍地运行它:

<td>{{getUser(userId).name}}</td>

但这似乎不是最好的方法。有没有更简单的方法来访问 userId 变量并将其设置为局部变量?

这是迄今为止我一直在玩的东西

4

4 回答 4

4

虽然您可以在 ngFor 模板指令上创建一个变量,但该变量只能取 index、even、odd 和 last 的值。

这就是为什么我可以在这种情况下使用管道,您需要将usersList&传递allUsers给自定义@PipegetUsers(它的作用与 Angular1 中的过滤器相同)。

标记

<tr *ngFor="let user of usersList | getUsers: allUsers">
  <td>
    {{user.name}}
  </td>
  <td>
    {{user.email}}
  </td>
  <td>
    {{user.level}}
  </td>
  <td>
    {{user.group}}
  </td>
</tr>

代码

@Pipe({
  name: 'getUsers',
  pure: false
})
export class GetUserPipe implements PipeTransform {
  constructor(){
    this.test = 'Test';
  }
  transform(array:Array<string>, object: any) : any {
    // for..in loop
    let output = [];
    for (var num in array)
    {
      // somehow object goes inner side
      output.push(object[0][array[num]]);
    }
    console.log(output)
    return output;
  }
}

演示 Plunkr

于 2016-02-02T21:36:23.393 回答
2

我喜欢

<td>{{getUser(userId).name}}</td>

这就是我会使用的。它比创建管道/过滤器要容易得多。

即使您可以使用本地模板变量做某事,我相信它会为列表中的每个项目、每个更改检测周期重新评估,就像上面显示的 HTML 一样。

另请参阅ng2:如何在 ngFor 循环中创建变量,其中一个建议是创建一个子组件,并将其传递getUser(userId)给该组件的输入属性。

于 2016-02-02T23:12:30.510 回答
0

你可以有你的标记如下

<tr *ngFor="theUser in getTheUsers(usersList)" >
   <td>{{theUser.name}}</td>
</tr>

getTheUsers()功能应该是这样的

getTheUsers(usersList:string[]){
  return usersList.map(user=> this.allUsers[user]); 
}
于 2019-09-16T12:52:51.200 回答
0

另请参阅使用 ng-container、*ngIf 和 let 的替代方法。虽然不理想,但您不需要创建子组件。基本上 *ngIf 的表达式创建了一个对象(因此 *ngIf 总是真实的,因此总是呈现内容)并且对象上的属性包含计算值。该对象被分配给局部变量(使用 *ngIf 的 let 语法)。

于 2021-04-03T11:11:14.483 回答