首先,我真的很失望,整个复选框部分没有记录。这引起了一些严重的问题。我想提供一个用户可以单击的字符串数组,并将选定的字符串存储到属性中。如果然后用户决定编辑当前项,他可以取消选中并检查其他一些值并更新数组中的值。听起来很简单?这是一场噩梦。
这就是我提出的:https://plnkr.co/edit/FECAKFDRyMn8CyV4SpqD?p=preview
步骤如下:写一个新名称,选择英语和德语,然后按“添加新”。然后选择“James”并取消选中“English”并按“Update”,您将看到所有语言都已被删除。我不知道我是否正确接近这个复选框问题,没有任何文档。
代码:
import { Component } from '@angular/core';
const LANG: any[] = [
{label: 'English'},
{label: 'German'},
{label: 'Italian'}
]
class Person {
constructor(public name:string; public speaking: string[]) {}
}
@Component({
selector: 'app-root',
templateUrl: './src/app/app.component.html',
styleUrls: ['./src/app/app.component.css']
})
export class AppComponent {
title = 'app works!';
people: Person[];
person: Person = new Person('', []);
languages: string[] = LANG;
constructor() {
let person1 = new Person('James', [Object.assign({}, LANG[0]), Object.assign({}, LANG[2])]);
let person2 = new Person('Frank', [Object.assign({}, LANG[1]));
this.people = [person1, person2];
}
AddNew(): void {
this.person.speaking = this.languages.filter(x => x.selected === true);
this.people.push(this.person);
this.person = new Person('', []);
}
Reset(): void {
this.person = new Person('', []);
}
Update(): void {
this.person.speaking = this.languages.filter(x => x.selected === true);
}
Edit(name: string): void {
this.person = this.people.find(x => x.name === name);
}
checkCondition(current: any): boolean {
return (this.person.speaking.find((x: any) => x.label === current.label) !== undefined);
}
}
HTML:
<h1>{{title}}</h1>
<form #form>
<input type="text" [(ngModel)]="person.name" name="name" placeholder="insert name" />
<br />
<br />
<label>Languages:</label>
<ul>
<li *ngFor="let language of languages">
<label>
<input type="checkbox" [(ngModel)]="language.selected" name="languages" [checked]="checkCondition(language)" />{{language.label}}
</label>
</li>
{{languages |json}}
</ul>
<br /><br />
<button (click)="Update()">Update</button> |
<button (click)="AddNew(); form.reset()">Add new</button> |
<button (click)="Reset(); form.reset()">Reset form</button>
</form>
<hr />
<ul>
<li *ngFor="let one of people">
{{one.name}}, speaking: {{one.speaking | json}} | <a href="#" (click)="Edit(one.name)">Edit</a>
</li>
</ul>
答案 0 :(得分:0)
您的代码有两个主要问题:
首先 - 每次创建新项目时都必须创建一个副本(而不是仅将所有项目引用到内存中的一个对象)。因此,在AddNew
方法中,请使用
this.people.push(Object.assign(new Person(), this.person));
第二 - 这一行:
this.languages.filter(x => x.selected === true);
错误,因为this.languages
仅包含标签(没有选定的属性),这就是您在编辑时重置所选语言的原因
答案 1 :(得分:0)
在调试代码后,我发现主要问题是,您使用复选框值作为person对象的一部分(复制对person.speaking的引用)。
您可以在AddNew函数中看到这一点:
创建新人时,使用过滤器复制所选值的引用,但您需要克隆对象。
(我确定没有JS wizzard,但这解决了添加问题:)
{{1}}
答案 2 :(得分:0)
我设法通过接近一点点来解决问题。无论如何,谢谢您的意见。
示例HTML代码:
<li *ngFor="let language of languages">
<label>
<input type="checkbox"
[checked]="checkCondition(language.label)"
(change)="updateCheckedOptions(language, $event)" />
{{language.label}}
</label>
</li>
可以在此处找到解决方案:https://plnkr.co/edit/OXXbt8jxZHzjB3jVYC0o?p=preview