Angular 角5通模型通过组件
我已经创建了一个简单的组件来包装bootstrap的typeahead控制器,以便按照我想要的方式对其进行配置。该组件有一个公共变量,Angular 角5通模型通过组件,angular,angular5,angular-ngmodel,Angular,Angular5,Angular Ngmodel,我已经创建了一个简单的组件来包装bootstrap的typeahead控制器,以便按照我想要的方式对其进行配置。该组件有一个公共变量,selectedWorker,它是来自typeahead的ngModel 现在,当我在其他地方使用这个组件时,我想这样做: <app-worker-lookup [(ngModel)]="foo"></app-worker-lookup> 然后将调用者的foo变量绑定到具有所选值的查找组件的公共变量。我不知道如何实现。为了在组件上提供
selectedWorker
,它是来自typeahead的ngModel
现在,当我在其他地方使用这个组件时,我想这样做:
<app-worker-lookup [(ngModel)]="foo"></app-worker-lookup>
然后将调用者的
foo
变量绑定到具有所选值的查找组件的公共变量。我不知道如何实现。为了在组件上提供ngModel
,您需要将组件实现为自定义表单控件。这应该是相对简单的,因为组件的表单行为将与typeahead相同
,或a,如果您愿意的话
需要注意的一点是,为了正确实现双向绑定,需要将typeahead组件的
[(ngModel)]
属性拆分为[ngModel]=“selectedWorker”(ngModelChange)=“onChange($event)”
,以便调用writeValue()
在onChange
方法中。要在组件中使用ngModel,您的类必须实现ControlValueAccesor并将组件添加到提供令牌
组成部分
@Component({
selector: 'component',
templateUrl: '../component.html',
styleUrls: ['../component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => Component),
multi: true
}
]
})
export class Component implements ControlValueAccessor {
//
// Now add ngModel property binding
@Input() ngModel : NgModel;
....
//
// ControlValueAccessor implementation
writeValue(value:any) {
this.value = value;
}
registerOnChange(fn) {
this.propagateChange = fn;
}
registerOnTouched(fn){
}
private propagateChange = (_:any) => {};
}
你好我明白了,DecoratorFactory没有供应商,你知道为什么吗?试着重新安装node_模块,你不必有问题。或者,请确保您编写的代码很好。如果您获得“no provider for decoratorfactory”,则应在提供程序的useExisting属性中将组件替换为您的组件名称。选中此项,您只需将
ngModel
用作@Input/@Output
名称。