2016-02-02 2 views
2

Рассмотрим список всех пользователей в системе:Как вы запускаете функцию по результату NgFor в Angular2?

allUsers = { 
    a: {name:'Adam',email:'[email protected]',level:'admin',group:'Owners'}, 
    b: {name:'Barbra',email:'[email protected]',level:'admin',group:'Owners'}, 
    c: {name:'Chris',email:'[email protected]',level:'standard',group:'Managers'}, 
    d: {name:'Dennis',email:'[email protected]',level:'standard',group:'Managers'}, 
    e: {name:'Elizabeth',email:'[email protected]',level:'standard',group:'Staff'}, 
    f: {name:'fred',email:'[email protected]',level:'visitor',group:'Visitor'}, 

    } 

Затем список пользователей на проекте:

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

Таким образом, вы имеете хорошую легкую функцию взять идентификатор пользователя и поиск остальных деталей пользователя:

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

затем в шаблоне вы используете * ngFor Перебери пользователь в списке, но вы хотите, чтобы затем LookUp полного набор деталей

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

Не работает ... Без создания пользовательских компонентов или других более сложных вещей, я не могу понять, как запустить функцию GetUser один раз для каждого пользователя. Я могу, конечно, использовать его снова и снова:

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

но это не похоже на лучший способ. Есть ли более простой способ получить доступ к переменной userId и установить ее как локальную переменную?

Here's a plunker of what I've been playing with so far

+0

Вы пробовали положить userId в фигурные скобки? Например: # user = "getUser ({{userId}})" –

+0

вы можете просто отфильтровать список, как это, а затем перебрать вместо переменной someUsers: 'var someUsers = usersList.map (function (x) { return allUsers [x]; }) ' – Marc

+0

картирование может работать ...Я должен был запускать его каждый раз, когда компонент работал, но мне нравится направление. Я не пробовал фигурные скобки, я не 100%, но я не думаю, что это правильный синтаксис. –

ответ

4

Хотя вы можете создать переменную по директиве шаблона ngFor, но эта переменная может принимать только значение индекса, даже, нечетные & последнего.

Вот почему я мог бы использовать трубу для этого случая, когда вам нужно передать usersList & allUsers обычаю @Pipe getUsers (он будет действовать так же, как фильтр в Angular1).

Markup

<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; 
    } 
} 

Demo Plunkr

+0

Это направление, в которое я пошел. Я на самом деле использую UserService, поэтому я смог ввести услугу прямо в трубу. Я все еще чувствую, что модификация получающейся локальной переменной будет полезна, но труба также делает ее более чистым. –

2

Мне нравится

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

Вот что я буду использовать. Это намного проще, чем создание, скажем, трубы/фильтра.

Даже если вы можете что-то сделать с помощью локальной переменной шаблона, я считаю, что она будет переоценена для каждого элемента в списке, каждый цикл обнаружения изменений, как и HTML, показанный выше.

См. Также ng2: How to create variable in ngFor loop, где одним из предложений является создание дочернего компонента и передача getUser(userId) в свойство ввода этого компонента.

+0

Но если нам нужно связать значение пользовательского объекта 10 раз с пользовательским интерфейсом, тогда нам нужно многократно повторять 'getUser (userId)' на HTML. Будет ли это хорошей практикой иметь его ..? –

+0

Согласен, работа с getUser снова и снова кажется не очень эффективной. –

+0

@PankajParkar, меньше кода почти всегда лучше. Я лично не буду писать дополнительный код, если не будет очевидной проблемы с производительностью. I.e, избегайте преждевременной оптимизации. 'getUser()' не является сложной функцией. –