#angular #controlvalueaccessor
Вопрос:
У меня есть один сторонний компонент, который принимает массив[объект] в ngModel и вносит в него изменения. Я использую его только для одного значения, поэтому я хочу, чтобы он просто принимал объект.
Я написал компонент с ControlValueAccessor
помощью . Это делает ввод и вывод изменений. это выбор автозаполнения. Проблема здесь в том, что когда я выбираю какое-то значение записи, называемое null, а затем объектом(а иногда бесконечным циклом, который убивает страницу). Я не хочу вызывать writevalue во время выбора пользователем. Вот мой компонент выглядит так
lt;sky-input-boxgt; lt;label *ngIf="label" class="sky-control-label"gt; {{label}} lt;/labelgt; lt;sky-lookup selectMode="single" [propertiesToSearch]="propertiesToSearch" [search]="search()" [searchResultTemplate]="searchResultTemplate" [descriptorProperty]="descriptorProperty" [attr.name]="name" [attr.id]="id" [(ngModel)]="value" (ngModelChange)="modalChange($event)"gt; lt;/sky-lookupgt; lt;/sky-input-boxgt; export class LookupSingleModeComponent implements OnInit, ControlValueAccessor { constructor() { } @Input() label?: string; @Input() searchFilters: any; @Input() propertiesToSearch: string[]; @Input() search: any; @Input() searchResultTemplate: any; @Input() descriptorProperty: string; @Input() name: string; @Input() id: string; value: any[]; ngOnInit(): void { } writeValue(obj: any): void { this.value = obj ? [obj] : []; } registerOnChange(fn: any): void { this.onChange = fn; } registerOnTouched(fn: any): void { this.onTouched = fn; } setDisabledState?(isDisabled: boolean): void { } onChange: any = () =gt; { }; onTouched: any = () =gt; { }; modalChange: any = () =gt; { this.onChange(Array.IsArray(this.value) ? this.value[0] : undefined); } } ``
Комментарии:
1. Это было решено на самом деле, мой компонент снова и снова инициализировался после выбора значения, которое запускает maodel/viewchange. Тем не менее, я держу его здесь для лучшего решения. Я также изменил его на реактивный подход, не знаю, почему он работает.