2

我正在尝试使用自定义组件包装 ng-select ( https://github.com/ng-select/ng-select ) 组件,我正在使用具有反应形式的 ControlValueAccessor,

export class ShNgSelectComponent implements OnInit, OnChanges, 
ControlValueAccessor {
   @Input() shItems: Array<object>;
   @Input() shBindValue: string;
   @Input() shBindLabel: string;
   @Input() shPlaceholder: any;

  @Output() shChange = new EventEmitter<Object>();

  ngOnInit() {  
  }


  writeValue(value: any): void {
    this.shItems = value || '';
  }

  propagateChange(event){
    this.shChange.emit(event);
   }


  registerOnChange(fn) {
    this.propagateChange = fn;
   }

  registerOnTouched() { }
}

这是 sh-ng-select 的模板

<ng-select [items]='shItems' [bindValue]='shBindValue' [placeholder]='shPlaceholder' [bindLabel]='shBindLabel' (change)='propagateChange($event)'></ng-select>

这是我要嵌入自定义组件的主要组件

<sh-ng-select [shItems]='manufactureList' [shFormGroup]='requestForm' (shChange)='getModels($event)' formControlName="manufactureId" [shPlaceholder]='"اختر الشركة المصنعة"' [shBindValue]='"id"' [shBindLabel]='"name"'></sh-ng-select>

shChange 事件在我添加 formControlName 之前正常触发,但是一旦我这样做,事件就不会触发,并且控制台不会抛出任何错误......这是为什么呢?

4

1 回答 1

1

对我来说,当您添加 formControlName 时,它​​会绑定它需要工作的所有内容,因此它将调用 registerOnChange 、 registerOnTouched、writeValue ... 因为他调用 registerOnChange 并执行“ this.propagateChange = fn ”,所以 propageChange 方法将不再引用您定义的一个:

  propagateChange(event){
    this.shChange.emit(event);
   }

所以不再调用 shChange 事件发射器


有关更多信息,使使用 [(ngModel)] / formControlName 的组件重复相同的模式,在这里您可以找到一个可以扩展以在组件中使用的简单实现: https ://github.com/xrobert35/asi-ngtools /blob/master/src/components/common/default-control-value-accessor.ts

一个使用它的简单组件:https ://github.com/xrobert35/asi-ngtools/blob/master/src/components/asi-checkbox/asi-checkbox.component.ts

于 2018-09-18T10:04:01.313 回答