2016-02-18 112 views
1

我有一个Queue,它本身有一个People数组。从队列中,我想按照人员模板中的定义显示每个人员。Angular 2:* ngFor指令列表

queue.ts

import {Component} from 'angular2/core'; 
import {Person} from '../person/person'; 
@Component({ 
    selector: 'queue', 
    directives: [Person], 
    template: `<div class="queue"> 
     <person *ngFor="#tP of people"></person> 
    </div>` 
}) 
export class Queue { 
    people = []; 
    constructor(){ 
     this.addPerson(new Person("Bob",20)); 
     this.addPerson(new Person("Jane",30)); 
     this.addPerson(new Person("Dog",40)); 
     this.addPerson(new Person("Cat",50)); 

    }; 
    addPerson(tP:Person):void 
    { 
     this.people.push(tP); 
    } 
} 

person.ts

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'person', 
    template: `<div class="person"> 
     <div class="name">{{name}}</div> 
     <div class="age">{{age}}</div> 
    </div>` 
}) 
export class Person { 
    constructor(public name:string = "", public age:number = 5){}; 
    setName(newName:string):void{ 
     this.name = newName; 
    } 
} 

我希望什么

<div class="queue"> 
<div class="person"><div class="name">Bob</div><div class="age">20</div></div> 
<div class="person"><div class="name">Jane</div><div class="age">30</div></div> 
<div class="person"><div class="name">Dog</div><div class="age">40</div></div> 
<div class="person"><div class="name">Cat</div><div class="age">50</div></div> 
</div> 

我得到了什么

例外:没有字符串的提供者! (人 - >字符串)在[人队列@ 1:16]

摘要

我想再现由所述指令本身所限定使用所述模板的指令的列表。

回答

2
<person *ngFor="let tP of people"></person> 

已经为people中的每个项目创建了一个新的人。相反,您应该将数据添加到people = [];,然后使用绑定将数据传递到组件。

constructor(){ 
    this.addPerson({name: "Bob", age: 20}); 
    this.addPerson({name: "Jane", age: 30}); 
    this.addPerson({name: "Dog", age: 40}); 
    this.addPerson({name: "Cat", age: 50}); 

}; 
<person *ngFor="let tP of people" [name]="tp.name" [age]="tp.age"></person> 
export class Person { 
    @Input() name:string; 
    @Input() age:number; 

    ngOnInit() { 
    console.log('name: ' + this.name + ', age: ' + this.age); 
    } 
} 

你通常不创建组件自己的情况下,您指示角度来为你做它。

如果组件具有构造函数参数,Angular会在提供者列表中查找它们并创建实例本身以将它们传递给构造函数。由于Angular没有string的提供商,因此您的错误消息是由此产生的。 (constructor(public name:string = "",

+0

嘿谢谢您的详细回复。所以在这个解决方案中,父队列有一个对象数组而不是Person,然后必须明确地将所有必需的属性传递给它通过* ngFor创建的。如果这是唯一的方法,那么很好(我不想减损你的帮助),但对我来说,这似乎是很多重复,它依赖于父母意识到孩子需要呈现什么。理想情况下,我希望父母对孩子说“爱,给自己!”而孩子则完成剩下的所有细节。 –

+0

关于字符串提供程序的问题,按照我的理解,我应该能够在构造函数中传递字符串,如此处所示 - https://egghead.io/lessons/angular-2-adding-a-data-model - 在1分钟标记 –

+1

这是一个不由Angular管理的模型类。该类用作数据的简单容器,而不是作为组件,甚至不作为服务,只能由您编写的代码实例化。 –