2016-03-08 18 views
0

考虑下面的代码,或者看看这个plunk:https://plnkr.co/edit/mwPHfz?p=infoAngular 2 binding:TypeError

import {Component} from "angular2/core"; 
import {DetailComponent} from "./detail.component"; 
import {User} from "./user"; 
import {MOCKUSERS} from "./mock-users"; 

@Component({ 
    directives: [DetailComponent], 
    selector: "master", 
    template: ` 
     <h2>Master</h2> 

     <div> 
      <ul> 
       <li *ngFor="#user of users" (click)="selectUser(user)"> 
        {{user.firstName}} {{user.lastName}} 
       </li> 
      </ul> 
     </div> 

     <div> 
      <detail [user]="selectedUser"></detail> 
     </div> 
    ` 
}) 
export class MasterComponent { 
    users: User[] = MOCKUSERS; 
    selectedUser: User; 

    selectUser(user: User) { 
     this.selectedUser = user; 
    } 
} 

详细

import {Component, Input} from "angular2/core"; 
import {User} from "./user"; 

@Component({ 
    selector: "detail", 
    template: ` 
     <h2>Detail</h2> 
     <div> 
      <div> 
       <input type="text" [(ngModel)]="user.firstName"> 
      </div> 
      <div> 
       <input type="text" [(ngModel)]="user.lastName"> 
      </div> 
      <div> 
       <button type="submit">Submit</button> 
      </div> 
     </div> 
    ` 
}) 
export class DetailComponent { 
    @Input() 
    user: User; 
} 

用户

export class User { 
    firstName: string, 
    lastName: string 
} 

当你点击一个名称列表(主)应该更新表格(细节)。名字和姓氏属性应分别出现在firstName和lastName输入中。

但是,当你在开发工具看,可以加载应用程序时,看到以下错误:

EXCEPTION: TypeError: l_user0 is undefined in [user.firstName in [email protected]:27]

所以不知何故似乎并结合用户不被接受。谁能说出原因?

回答

3

您将一个未定义的对象(在选择用户之前)传递给DetailComponent。如果存在selectedUser,则只应呈现DetailComponent。

<div *ngIf="selectedUser"> 
    <detail [user]="selectedUser"></detail> 
</div> 

Working plunker。在index.html中,我必须将导入的角度js文件从angular.min.js替换为angular.dev.js,以便在您的plunker上修复不相关的问题。

+0

我已经尝试了* ngIf,但对我来说主要问题确实是需要更改的角度文件。在另一个项目中,我从测试版6切换到测试版8,事情也开始在那里工作。 – Aetherix

+0

@Aetherix缩小的包还有一些未解决的问题,请检查[#6380](https://github.com/angular/angular/issues/6380) – Abdulrahman

0
<ul class="list-group users-list"> 
    <li class="list-group-item" 
     *ngFor="let user of users" 
     (click)="selectUser(user)" 
     [class.active]="user === activeUser"> 
     {{ user.name }} ({{ user.username }}) 
    </li> 
</ul> 
+0

虽然此代码可能会回答问题,但提供了有关和/或为什么它解决了这个问题会提高答案的长期价值。 –

0

您应该初始化selectedUser参数。

export class MasterComponent { 
    users: User[] = MOCKUSERS; 
    selectedUser: User = null; 

    selectUser(user: User) { 
     this.selectedUser = user; 
    } 
} 


<div> 
    <detail [user]="selectedUser"></detail> 
</div> 



@Component({ 
    selector: "detail", 
    template: ` 
     <h2>Detail</h2> 
     <div *ngIf="user !== null"> 
      <div> 
       <input type="text" [(ngModel)]="user.firstName"> 
      </div> 
      <div> 
       <input type="text" [(ngModel)]="user.lastName"> 
      </div> 
      <div> 
       <button type="submit">Submit</button> 
      </div> 
     </div> 
    ` 
}) 

export class DetailComponent { 
    @Input() user: User = null; 
}