Angular 2 具有 ngModel 的组件未更新父模型
Angular 2 Component with ngModel not updating parent model
我正在尝试为复选框等输入创建一个包装器组件,但我无法更改父 (inputValue) 变量,即使它被设置为 ngModel。
这是我的组件定义:
@Component({
selector: 'my-checkbox',
inputs: ['inputValue', 'label'],
template: `
<div class="ui checkbox">
<input type="checkbox" name="example" [(ngModel)]="inputValue" (change)="onChange($event)">
<label>{{label}}</label>
</div>`
})
export class CheckboxComponent {
inputValue: boolean;
onChange(event) {
this.inputValue = event.currentTarget.checked;
console.log(this.inputValue);
}}
我在父视图中这样使用它:
<my-checkbox [inputValue]="valueToUpdate" [label]="'Test Label'"></my-checkbox>
控制台确实正确记录,我可以看到内部 (inputValue) 正在更新但外部没有 'valueToUpdate'(ngModel 双向绑定未正确更新)。
您需要为您的组件定义一个输出并使用 EventEmitter
class 来触发相应的事件。
@Component({
selector: 'my-checkbox',
inputs: ['inputValue', 'label'],
outputs: ['inputValueChange']
template: `
<div class="ui checkbox">
<input type="checkbox" name="example" [(ngModel)]="inputValue" (change)="onChange($event)">
<label>{{label}}</label>
</div>`
})
export class CheckboxComponent {
inputValue: boolean;
inputValueChange: EventEmitter<any> = new EventEmitter();
onChange(event) {
this.inputValue = event.currentTarget.checked;
console.log(this.inputValue);
this.inputValueChange.emit(this.inputValue);
}
}
这样您就可以为您的子组件使用两个绑定:
<my-checkbox [(inputValue)]="valueToUpdate" [label]="'Test Label'">
</my-checkbox>
按照@Thierry 的回答(即使用输出 属性),但我建议使用内置的 ngModelChange
事件,而不是使用两个事件绑定。即,具有 [(ngModel)]
和 (change)
会导致两个事件绑定,因此每次点击都会有两个事件处理程序 运行。内置的ngModelChange
事件也有点nicer/cleaner,因为$event
已经映射到复选框的值,而不是DOM点击事件。因此,这是对@Thierry 的回答的建议更改:
<input type="checkbox" name="example"
[ngModel]="inputValue" (ngModelChange)="onChange($event)">
onChange(newValue) {
this.inputValue = newValue;
console.log(newValue);
this.inputValueChange.emit(newValue);
}
我正在尝试为复选框等输入创建一个包装器组件,但我无法更改父 (inputValue) 变量,即使它被设置为 ngModel。
这是我的组件定义:
@Component({
selector: 'my-checkbox',
inputs: ['inputValue', 'label'],
template: `
<div class="ui checkbox">
<input type="checkbox" name="example" [(ngModel)]="inputValue" (change)="onChange($event)">
<label>{{label}}</label>
</div>`
})
export class CheckboxComponent {
inputValue: boolean;
onChange(event) {
this.inputValue = event.currentTarget.checked;
console.log(this.inputValue);
}}
我在父视图中这样使用它:
<my-checkbox [inputValue]="valueToUpdate" [label]="'Test Label'"></my-checkbox>
控制台确实正确记录,我可以看到内部 (inputValue) 正在更新但外部没有 'valueToUpdate'(ngModel 双向绑定未正确更新)。
您需要为您的组件定义一个输出并使用 EventEmitter
class 来触发相应的事件。
@Component({
selector: 'my-checkbox',
inputs: ['inputValue', 'label'],
outputs: ['inputValueChange']
template: `
<div class="ui checkbox">
<input type="checkbox" name="example" [(ngModel)]="inputValue" (change)="onChange($event)">
<label>{{label}}</label>
</div>`
})
export class CheckboxComponent {
inputValue: boolean;
inputValueChange: EventEmitter<any> = new EventEmitter();
onChange(event) {
this.inputValue = event.currentTarget.checked;
console.log(this.inputValue);
this.inputValueChange.emit(this.inputValue);
}
}
这样您就可以为您的子组件使用两个绑定:
<my-checkbox [(inputValue)]="valueToUpdate" [label]="'Test Label'">
</my-checkbox>
按照@Thierry 的回答(即使用输出 属性),但我建议使用内置的 ngModelChange
事件,而不是使用两个事件绑定。即,具有 [(ngModel)]
和 (change)
会导致两个事件绑定,因此每次点击都会有两个事件处理程序 运行。内置的ngModelChange
事件也有点nicer/cleaner,因为$event
已经映射到复选框的值,而不是DOM点击事件。因此,这是对@Thierry 的回答的建议更改:
<input type="checkbox" name="example"
[ngModel]="inputValue" (ngModelChange)="onChange($event)">
onChange(newValue) {
this.inputValue = newValue;
console.log(newValue);
this.inputValueChange.emit(newValue);
}