3

我有一个这样的数组:

 objectArray = [
        {"name": "Car"},
        {"name": "Bike"},
        {"name": "Boat"},
        {"name": "Plane"}
    ];

和这样的模板:

<li *ngFor="#obj of objectArray">
   <a href="#" class="small" data-value="option1" tabIndex="-1">
      <input type="checkbox" (change)="expression && expression.value = $event.target.checked ? true : undefind" [ngModel]="expression?.value">
      <label for="">{{ obj.name }}</label>
   </a>
</li>

但是,当检查1个复选框时,这将设置为正确。我该如何单独设置?

4

2 回答 2

9

我在使用最新版本的 Angular 2 时遇到了一些麻烦。这是我想出的对包含角色名称和布尔值的对象列表进行双向绑定的方法,用于检查角色。

在此处输入图像描述

<form [formGroup]="userInfoForm" (ngSubmit)="onSubmit(userInfoForm)">

...

 <input type="hidden" name="roles" formControlName="roles" [(ngModel)]="roleSelections">
 <div *ngFor="let role of roleSelections">
     <input type="checkbox" 
            [value]="role.isChecked" 
            [checked]="role.isChecked" 
            (change)="$event.target.checked ? role.isChecked = true : role.isChecked = false">
       {{role.name}}
 </div>

RoleSelection 只是一个具有两个字段的简单类:

export class RoleSelection {
constructor(
    public name: string,
    public isChecked: boolean)
    { }
}

在组件中,我必须在创建 FormGroup 时声明一个名为 roles 的属性,然后将其绑定到上面 HTML 中的隐藏字段。

    this.userInfoForm = new FormGroup({
        emailAddress: new FormControl(this.userInfo.emailAddress, Validators.required),
        firstName: new FormControl(this.userInfo.firstName, Validators.required),
        middleName: new FormControl(this.userInfo.middleName),
        lastName: new FormControl(this.userInfo.lastName, Validators.required),
        isAdmin: new FormControl(this.userInfo.isAdmin),
        isArchived: new FormControl(this.userInfo.isArchived),
        roles: new FormControl(this.roleSelections)
    });

然后在提交表单后,ngSubmit 方法只需提取它需要的内容:

 private onSubmit(obj: any) {
    if (obj.valid) {
        let account: IUserAccount = {};
        account.id = this.userAccountId;
        account.firstName = obj.controls.firstName.value;
        ...
        ...
        // get list of roles checked via obj.controls.roles.value[i].isChecked etc
        ...
        ...
        // do submission
    }
 }
于 2016-12-23T21:10:25.657 回答
7

我想这就是你想要的:

<li *ngFor="let obj of objectArray">
   <a href="#" class="small" data-value="option1" tabIndex="-1">
<input type="checkbox"  
    (change)="expression && expression[obj.name]=$event.target.checked ? true : undefined"
    [ngModel]="expression && expression[obj.name]">
   </a>
</li>

更新 使用(ngModelChange)通常比(change)特别是如果[ngModel]使用更好

<input type="checkbox"  
    (ngModelChange)="expression && expression[obj.name]= $event ? true : undefined"
    [ngModel]="expression && expression[obj.name]">
于 2016-04-11T12:50:00.477 回答