Поведение, которое вы описываете, происходит, когда ввод не является примитивным типом (число / строка / логическое значение). Если это сложный объект (отличный от null
), и вы изменяете любое свойство объекта, это изменение отразится на родительском объекте, потому что оно одинаково: вы имеете дело со ссылками, а не со значениями.
Вы должны сделать глубокое клонирование ввода, если хотите избежать этой ситуации, например:
private _data: any;
@Input() set data(d: any) {
// If you want to improve performance, use this library to do a deep clone:
// https://github.com/planttheidea/fast-copy
// otherwise, you can go with JSON.parse(JSON.sringify(...))
this._data = d ? JSON.parse(JSON.sringify(d)) : null;
}
get data(): any {return this._data;}
Дополнительная информация
Теперь, как информация: чтобы действительно использовать 2- способ привязки данных, если вы хотите:
@Input() data:any = {}
// mandatory: the same name of the @Input, suffixed with "Change"
@Ouput() dataChange = new EventEmitter<any>();
Тогда вы можете использовать в родительской нотации «банан в коробке»:
<app-config-form [(data)]="param"></app-config> //param is ngModel
Но обновление не запускается автоматически. Каждый раз, когда вы меняете его у ребенка, вы должны звонить this.dataChange.emit(value)
.
Например (у ребенка):
buttonClickHandler() {
this.data = 2;
this.dataChange.emit(2);
}