【发布时间】:2017-07-15 14:18:33
【问题描述】:
我正在开发一个可重用的小型组件,它可以设置单选按钮的样式并发出选定的值。
import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core";
@Component({
moduleId: module.id,
selector: 'button-select',
template: `<div class="toggle-group">
<div *ngFor="let choice of choices">
<input type="radio"
id="{{ groupName + choice }}"
name="{{groupName}}"
value="{{ choice }}"
[checked]="choice === defaultChoice"
[(ngModel)]="value"
(ngModelChange)="choose($event)" />
<label class="toggle-button"
for="{{ groupName + choice }}">{{ choice }}</label>
</div>
</div>`,
styleUrls: [
'editableField.css',
'buttonSelect.css'
]
})
export class ButtonSelectComponent implements OnInit {
@Input() choices: string[];
@Input() defaultChoice: string;
@Input() groupName: string;
@Input() value: string;
@Output() valueChosen: EventEmitter<any> = new EventEmitter();
ngOnInit() {
this.choose(this.defaultChoice);
}
private choose(value: string) {
this.valueChosen.emit(value);
}
}
组件是这样实现的:
<button-select #statusFilter
[choices]="['All', 'Active', 'Draft']"
[defaultChoice]="'All'"
[groupName]="'statusFilter'"
(valueChosen)="filterChosen('statusFilter', $event)"
</button-select>
在添加[(ngModel)]="value" (ngModelChange)="choose($event)"到按钮选择组件之前,[checked]="choice === defaultChoice"指令正确设置了相关<input />上的checked属性。
之后添加[(ngModel)],仅 ng-reflect-checked="true" 被设置,这会阻止视觉样式显示默认值(因为我的 CSS 使用伪选择器)。
将[(ngModel)] 更改为[ngModel] 无效。
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
请注意您使用的名称属性:
name="{{groupName}}"不会封装您的无线电组。一旦您选择任何单选组,您就可以使用箭头键导航到同一页面上另一个单选组中的另一个单选按钮。原因是 Angular 不会自己添加name属性,而是添加ng-reflect-name。