Это из-за мутации объекта, ваш элемент списка родительского компонента и объект элемента диалогового окна ссылаются на одну и ту же область памяти
вам нужно сделать копию элемента списка, прежде чем передавать его в диалоговое окно, есть два способа сделать копию
- мелкая копия
- глубокая копия
, как здесь определено
Мелкая копия - побитовая копия объекта. Создается новый объект, который имеет точную копию значений в исходном объекте. Если какие-либо поля объекта являются ссылками на другие объекты, копируются только ссылочные адреса, т. Е. Копируется только адрес памяти.
Пример
var a = {"a":2, "b": [2,3]};
var b = Object.assign({}, a);
const log = (step) => {
console.log('before changes')
console.log('value of a.a =>', a.a);
console.log('value of b.a =>', b.a);
console.log('value of a.b =>', a.b);
console.log('value of b.b =>', b.b);
}
log('before changes')
console.log('updating b.a from 2 to 3');
b.a = 3;
log('after changes in b.a');
console.log('append 4 to b.b');
b.b.push(4);
log('after appending 4 to b.b')
Глубокая копия копирует все поля и создает копии динамически распределенной памяти, на которую указывают поля. Глубокое копирование происходит, когда объект копируется вместе с объектами, к которым он относится.
, поэтому перед передачей значения в диалог вы можете сделать копию, используя Object.assign
const newCopy = Object.assign({}, p);
dialogConfig.data = {
person:newCopy
};
const dialogRef = this.dialog.open(PersonEditorComponent,dialogConfig);
или вы можете javascript новый Деструктуризация объекта
const newCopy = {...p};
dialogConfig.data = {
person: newCopy
};
о 2-м вопросе (таблица не обновляется)
после обновления данных, вам нужно вызвать изменение обнаружение обновить строку таблицы матов. см. эту ссылку для получения дополнительной информации по этой
здесь есть рабочая демонстрационная ссылка