Angular 5 проходов ngModel через компоненты

Я создал простой компонент, который обертывает контроллер typeahead начальной загрузки, поэтому он настроен так, как я хочу для приложения. Компонент имеет общедоступную переменную selectedWorker, которая является ngModel из заголовка типа.

Итак, теперь, когда я использую этот компонент в другом месте, я бы хотел сделать что-то вроде этого:

<app-worker-lookup [(ngModel)] = "foo"></app-worker-lookup>

А затем привяжите переменную foo вызывающего абонента к общедоступной переменной компонента поиска, имеющего выбранное значение. Я не знаю, как это реализовать.

Отметьте Реализовать двустороннюю привязку данных для настраиваемого свойства, вам нужно использовать только ngModel в качестве имени @Input/@Output.

jcubic 18.03.2019 15:53
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
1
9 629
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы 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 нет провайдера, знаете почему?

mariomol 29.11.2018 14:51

Попробуйте переустановить node_modules, у вас не должно быть проблем. Или следите за тем, чтобы вы хорошо писали код.

Antonio de la mata 07.12.2018 10:03

Если вы получили «no provider for decoratorfactory», вы должны заменить Component на имя вашего Component в свойстве useExisting провайдера.

Robert 27.11.2019 13:20

Другие вопросы по теме