有没有办法一起使用ngModel和NgFor?

时间:2018-07-03 08:06:29

标签: angular typescript angular-ngmodel ngfor

当用户单击“取消”按钮时,我想重置复选框的值。有没有一种方法可以一起使用ngFor和NgModel以便重置值?我正在尝试将*ngFor使用的对象设置为早期版本。

HTML

   <div *ngFor="let object of objects">
            <input [(ngModel)]="object.isSelected" type="checkbox"> 
   </div>

   <button type="button" (click)="cancel()">Cancel</button>

TypeScript

cancel(){
   this.object = this.unChangedObject;
}

这些值会重置,但是如何向用户显示更改?

2 个答案:

答案 0 :(得分:0)

使用Object.assign将对象深层复制到另一个变量,然后在取消函数中分配它

constructor(){
  this.unChangedObject = Object.assign({},this.object  )
}

cancel(){
   this.object = this.unChangedObject;
}

答案 1 :(得分:0)

您可以用其他方式查看它。仅在提交时更新。为此,您可以在*ngFor上使用管道,该管道返回复制对象的数组。尽管该解决方案仅适用于浅层对象,但是您也可以尝试找到一些深层复制方法(下面的未测试代码):

管道

@Pipe({
  name: 'copyArr'
})
export class CopyArrPipe implements PipeTransform {
  public transform(arr: object[] = []): object[] {
    return arr.map(obj => ({...obj}));
  }
}

模板

<ng-container *ngIf="objects | copyArr as objectsCopy">

  <div *ngFor="let object of objectsCopy">
    <input [(ngModel)]="object.isSelected" type="checkbox"> 
  </div>

  <button type="button" (click)="cancel()">Cancel</button>
  <button type="button" (click)="commit(objectsCopy)">Commit</button>
</ng-container>

组件

@Component({...})
export class FooBarComponent {

  objects = [];

  cancel(){
    this.objects = [...this.objects];
  }

  commit(newObjects) {
    this.objects = newObjects;
  }
}