3

我正在尝试为复选框等输入创建一个包装器组件,但我无法更改父 (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 双向绑定没有正确更新)。

4

2 回答 2

6

您需要为您的组件定义一个输出并使用EventEmitter该类来触发相应的事件。

@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>
于 2016-02-23T14:56:52.637 回答
4

按照@Thierry 的回答(即使用输出属性),但我建议使用内置ngModelChange事件,而不是使用两个事件绑定。即,具有[(ngModel)](change)导致两个事件绑定,因此每次单击都会运行两个事件处理程序。内置ngModelChange事件也更好/更清晰,因为$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);
}

Plunker

于 2016-02-23T16:53:43.313 回答