Я хочу создать настраиваемый элемент управления, который не содержит никаких входных данных. Всякий раз, когда элемент управления изменяется, я хочу сохранить полную форму.Как вызвать change() в угловой форме с помощью настраиваемого элемента управления без ввода
Наш нынешний подход использует форму, изменил мероприятие, как это:
<form #demoForm="ngForm" (change)="onChange()">
<custom-input name="someValue" [(ngModel)]="dataModel">
</custom-input>
</form>
Как вы можете видеть, мы используем «изменить» -Event реагировать на любые изменения в форме. Это прекрасно работает, если у нас есть входы, флажки, ... как элементы управления.
Но наш пользовательский контроль существует только из простого div, на который мы можем нажать. Всякий раз, когда я нажимаю на div, значение элемента управления увеличивается на 1. Но «изменение» - событие формы не запускается. Должен ли я каким-то образом связать свой настраиваемый элемент управления с формой? Или есть какие-то события, которые нужно уволить?
import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
@Component({
selector: 'custom-input',
template: `<div (click)="update()">Click</div>`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputComponent),
multi: true
}]
})
export class CustomInputComponent implements ControlValueAccessor {
private onTouchedCallback:() => void =() => {};
private onChangeCallback: (_: any) => void =() => {};
update(){
this.value++;
}
get value(): any {
return this.innerValue;
};
set value(v: any) {
console.log("Change to");
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
}
}
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}
registerOnChange(fn: any) {
this.onChangeCallback = fn;
}
registerOnTouched(fn: any) {
this.onTouchedCallback = fn;
}
}
Я создал plunker, чтобы продемонстрировать эту проблему: https://plnkr.co/edit/ushMfJfcmIlfP2U1EW6A
Всякий раз, когда вы нажимаете на «Нажмите» модель-значение увеличивается, но нет никакого вывода на консоль, как изменение -event не уволен ... (Существует ссылка console.log, связанная с событием change)
Обратите внимание на выдержки из тегов, которые показывают, когда вы добавляете теги. 'angularjs' для AngularJS 1.x. 'angular2' для Angular 2+. –
Формы HTML5 имеют очень определенный определенный список элементов, которые считаются частью дерева форм; элементы, не входящие в этот список, включая 'div',' span', 'table' и другие, включая пользовательские элементы, не будут обрабатываться как часть формы HTML5. вы можете * сделать это, если ваш компонент использовал 'output', а не' div' для своего шаблона, но это может не работать так, как вы ожидаете. В принципе, это не встроено в спецификацию. – Claies