多个select表单双向绑定
multiple select form two-way binding
我有多个 select 表格:
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected}}</p>
我想显示用户 select 在 <p>You selected: {{selected}}</p>
表单下编辑的选项,但如果我这样做,我会在 select 3 种配料时得到:
You Selected: [object Object],[object Object],[object Object]
现在我试了<p>You selected: {{selected?.value}}</p>
我没有得到任何条目。
到目前为止我找到的唯一解决方案是:
<p>You selected: {{selected | json}}</p>
但我不希望整个 json 对象只是值 属性.
如何让它显示:
You selected: option1, option2, option3
?
您可以在要绑定到模板中的组件上创建一个新的 属性,或者创建一个新的管道来显示逗号分隔的项目。
没有管道:
get displaySelections(): string {
return this.selections.map(s => s.value).join(', ');
}
<p>You selected: {{displaySelections}}</p>
使用管道,您也可以在其他组件中重复使用,并且不需要添加 getter:
@Pipe({
name: 'join'
})
export class JoinPipe implements PipeTransform {
transform(value: {value: any}[]): string {
return value.map(v => v.value).join(', ');
}
}
<p>You selected: {{ selections | join }}</p>
Try Changing your HTML to :-
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected | json}}</p>
打印“[object, object]”意味着您正在尝试将对象用作字符串。
toppings
是一个对象数组。您正在使用 let topping of toppings
遍历此数组并将对象分配给 topping
.
{{topping.value}}
打印顶部对象 .value
属性 中的字符串,但您在 [value]="topping"
.
中分配回整个对象
这样 selected
就变成了一个对象数组,尽管您在单击选项时只能看到字符串。
两种方式实现你想要的;
- 从选项传递字符串
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping.value">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected}}</p>
- 遍历所选数组
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected:
<span *ngFor="let s of selected; let f = first; let l = last;">
{{s.value}}
<span *ngIf="!(f && l) && !l">,</span>
</span>
</p>
我希望这可以帮助您阐明 angular 模板和数据绑定。
我有多个 select 表格:
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected}}</p>
我想显示用户 select 在 <p>You selected: {{selected}}</p>
表单下编辑的选项,但如果我这样做,我会在 select 3 种配料时得到:
You Selected: [object Object],[object Object],[object Object]
现在我试了<p>You selected: {{selected?.value}}</p>
我没有得到任何条目。
到目前为止我找到的唯一解决方案是:
<p>You selected: {{selected | json}}</p>
但我不希望整个 json 对象只是值 属性.
如何让它显示:
You selected: option1, option2, option3
?
您可以在要绑定到模板中的组件上创建一个新的 属性,或者创建一个新的管道来显示逗号分隔的项目。
没有管道:
get displaySelections(): string {
return this.selections.map(s => s.value).join(', ');
}
<p>You selected: {{displaySelections}}</p>
使用管道,您也可以在其他组件中重复使用,并且不需要添加 getter:
@Pipe({
name: 'join'
})
export class JoinPipe implements PipeTransform {
transform(value: {value: any}[]): string {
return value.map(v => v.value).join(', ');
}
}
<p>You selected: {{ selections | join }}</p>
Try Changing your HTML to :-
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected | json}}</p>
打印“[object, object]”意味着您正在尝试将对象用作字符串。
toppings
是一个对象数组。您正在使用 let topping of toppings
遍历此数组并将对象分配给 topping
.
{{topping.value}}
打印顶部对象 .value
属性 中的字符串,但您在 [value]="topping"
.
这样 selected
就变成了一个对象数组,尽管您在单击选项时只能看到字符串。
两种方式实现你想要的;
- 从选项传递字符串
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping.value">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected: {{selected}}</p>
- 遍历所选数组
<mat-form-field>
<mat-label>Toppings</mat-label>
<mat-select [(value)]="selected" multiple>
<mat-option *ngFor="let topping of toppings" [value]="topping">{{topping.value}}</mat-option>
</mat-select>
</mat-form-field>
<p>You selected:
<span *ngFor="let s of selected; let f = first; let l = last;">
{{s.value}}
<span *ngIf="!(f && l) && !l">,</span>
</span>
</p>
我希望这可以帮助您阐明 angular 模板和数据绑定。