Как оживить control value accessor?

198
31 мая 2018, 13:30

Пытаюсь разобраться с control value accessor и набросал простейший пример. В каждой функции поставил консоль лог чтобы посмотреть в какой именно момент она срабатывает.

Проблема в том, что ни одна из этих функций не срабатывает. Хотя при этом ошибок в консоли нет. И вообще я реализовал интерфейс control value accessor поэтому должно хоть что-то происходить

Помогите пожалуйста оживать пример. Демо здесь

js:

  name: FormGroup;
  constructor(fb: FormBuilder) {
    this.name = fb.group({
      firstName:['1'],
      lastName: ['22']
    });
  }
  writeValue(value: any) {
    console.log('writeValue', value);
    if(value) {
        this.name.setValue(value);
    }
  }

  registerOnChange(fn: (value: any) => void) {
    console.log('registerOnChange');
    this.name.valueChanges.subscribe(fn);
  }
  registerOnTouched() {
    console.log('registerOnTouched');
  }

html:

  <div [formGroup]="name">
    <input formControlName="firstName">
    <input formControlName="lastName">
  </div>
Answer 1

control value accessor используется для реализации ngModel в кастомном компоненте. Потому ваша в данный момент и не работает. Вот пример реализации control value accessor:

@Component({
selector: 'app-custom-component',
templateUrl: './app-custom.component.html',
styleUrls: ['./app-custom.component.scss'],
providers: [
        {
            provide: NG_VALUE_ACCESSOR,
            useExisting: forwardRef(() => CustomComponent),
            multi: true
        }
    ]
})
export class CustomComponent implements ControlValueAccessor {
    private _begin: Date;
    set begin(value) {
        this._begin = value;
        this.onChange(this._begin);
    }
    get begin() {
        return this._begin;
    }        
    onChange = (_: any) => { };
    OnTouched = (_: any) => { };
    constructor() { }
    writeValue(value: Date): void {
        this.begin = value;
    }
    registerOnChange(fn: any): void {
        this.onChange= fn;
    }
    registerOnTouched(fn: any): void {
        this.onTouched= fn;
    }
    setDisabledState?(isDisabled: boolean): void {
        /*реализация для свойства disabled*/
    }
}

В разметке компоненты:

<input type="date" [(ngModel)]="begin" name="begin">

Непосредственное использование:

<app-custom-component [(ngModel)]="currentDate"></app-custom-component>

В компоненте объявить свойство currentDate

Как то так.

READ ALSO
Отладка приложения с исходниками Meteor

Отладка приложения с исходниками Meteor

Я новичок в javascriptИспользую VSCode

177
Как пополнять контент на bootstrap шаблоне?

Как пополнять контент на bootstrap шаблоне?

Имеется обычный шаблон bootstrap с использованием html/css/jsНужно по типу CMS пополнять раздел новости с сохранением дизайна сайта

226
Получение значения из .json файла [закрыт]

Получение значения из .json файла [закрыт]

Как получить массив со значениями изjson-файла?

221
Просмотр видео онлайн

Просмотр видео онлайн

Как можно настроить просмотр видео онлайн с кем-то как на watch2gether или подобных сервисах? Использовал webrtc (https://webrtcgithub

230