Я создал простой компонент, который обертывает контроллер typeahead начальной загрузки, поэтому он настроен так, как я хочу для приложения. Компонент имеет общедоступную переменную selectedWorker, которая является ngModel из заголовка типа.
Итак, теперь, когда я использую этот компонент в другом месте, я бы хотел сделать что-то вроде этого:
<app-worker-lookup [(ngModel)] = "foo"></app-worker-lookup>
А затем привяжите переменную foo вызывающего абонента к общедоступной переменной компонента поиска, имеющего выбранное значение. Я не знаю, как это реализовать.





Чтобы ngModel был доступен в компоненте, вам необходимо реализовать компонент как настраиваемый элемент управления формой. Это должно быть относительно просто, поскольку поведение формы вашего компонента будет таким же, как у typeahead.
Вот хорошая статья о том, как это сделать или Ответ на переполнение стека, если хотите.
Следует отметить, что для правильной реализации двусторонней привязки вам необходимо разделить атрибут [(ngModel)] компонента typeahead на [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_modules, у вас не должно быть проблем. Или следите за тем, чтобы вы хорошо писали код.
Если вы получили «no provider for decoratorfactory», вы должны заменить Component на имя вашего Component в свойстве useExisting провайдера.
Отметьте Реализовать двустороннюю привязку данных для настраиваемого свойства, вам нужно использовать только
ngModelв качестве имени@Input/@Output.