4

我正在尝试使用 ngModel 在 Angular 2 中创建一个选择组件包装器。一旦更改选择,所有事件都会正确触发,但我无法在呈现初始选择时设置它。

这是我的组件:

@Component({
selector: 'my-dropdown',
inputs: ['selectedItem', 'items', 'label'],
outputs: ['selectedItemChange'],
template: `
<div class="field">
  <label>{{label}}</label>
    <select class="ui search selection dropdown" [ngModel]="selectedItem" (change)="onChange($event.target.value)">
      <option value="" selected>Please Select</option>
      <option *ngFor="#item of items" [value]="item.value">{{item.label}}</option>
    </select>
</div>`
})

export class MyDropdownComponent {

items: DropdownValue[];
selectedItem: DropdownValue;
selectedItemChange: EventEmitter<any> = new EventEmitter();

private onChange(newValue) {

    console.log(newValue);
    this.selectedItem = this.items.find(item => item.value == newValue);
    console.log(this.selectedItem);
    this.selectedItemChange.emit(newValue);
}
}

我在这样的视图中使用它:

<my-dropdown [items]="selectItems" [(selectedItem)]="itemToSelect" [label]="'Please Select'"></my-dropdown>

当我itemToSelect在初始化时在父组件中设置值时,它不会在 UI 中设置选定的选项值。

我也尝试使用该ngModelChange事件,但它不会触发更改事件。

4

2 回答 2

6

itemToSelect初始设置为对象,因此 MyDropdownComponent 的输入属性初始设置为对象。但是随后在onChange()字符串中的值被emit()ted,然后导致itemToSelect设置为字符串,因此输入属性变为字符串。不好。

只要始终如一地使用一个对象,它就会起作用。此外,不需要分配this.selectedItemin onChange(),因为选定的值将从父级向下传播(通常,您永远不应该在组件中设置输入属性——它看起来也很奇怪)。您ngModelChange现在也可以使用:

<select class="ui search selection dropdown" [ngModel]="selectedItem.value"
 (ngModelChange)="onChange($event)">

private onChange(newValue) {
    console.log('nv',newValue);
    selectedItem = this.items.find(item => item.value == newValue);
    console.log('si',selectedItem);
    this.selectedItemChange.emit(selectedItem);
  }
}

Plunker

请注意,我没有解决用户选择“请选择”的问题。您需要添加一些逻辑onChange()来处理这种情况。

于 2016-02-24T19:11:54.920 回答
1

当我在初始化时在父组件中设置 itemToSelect 值时,它不会在 UI 中设置选定的选项值。

假设您ngOnInit()在父级中使用,您应该在稍后调用的生命周期挂钩之一中设置值(因为子级尚不存在ngOnInit()),请尝试ngAfterViewInit()...

于 2016-02-24T09:14:38.050 回答