Не обновляется ссылочный объект
Здравствуйте, уважаемые. Вопрос из базовых, но у меня вызвал затруднения. Есть древовидная структура. Я в компоненте либо добавляю, либо редактирую узлы. После обновления/создания элемента во внешнем компоненте, он приходит у родителю и там пытается обновить переменную класса componentData. После этого, по идее, обновления должны прорисоваться в родителе. Но этого не происходит.
Обновление входящими данными:
getChangedItemToList(incomeItem ){
if (incomeItem) {
let oldItem = Util.getTreeItemById(incomeItem.id, this.componentData);
if (oldItem) { // Апдейт
console.log("before", oldItem, this.componentData);
oldItem = incomeItem;
console.log("after", oldItem, this.componentData);
} else { // Вставка нового узла
if(!incomeItem.parent_id) { // Рубрика
this.componentData = [incomeItem, ...this.componentData];
} else { // Обычный элемент
const itemParent = Util.getTreeItemById(incomeItem.parent_id, this.componentData);
if(!itemParent.children) itemParent.children = [];
itemParent.children.unshift(incomeItem);
}
}
}
}
А вот функция поиска узла дерева:
export class Util {
static getTreeItemById(id: string, tree: IUniversalTreeNode[]): IUniversalTreeNode{
for (let count = 0; count < tree.length; count++) {
if(tree[count].id == id){
return tree[count];
} else if(tree[count].children && tree[count].children.length > 0){
const res = this.getTreeItemById(id, tree[count].children);
if(res !== null) return res;
}
}
return null;
}
}
По идее getTreeItemById возвращает ссылку на элемент дерева. И если я этот элемент обновлю, то, в моем понимании, поскольку это ссылка, должен обновиться и объект, который содержит узел дерева, который я нашел (oldItem = incomeItem; ). Но если oldItem обновился, то this.componentData не изменился. Подскажите пожалуйста в чем ошибка. |
sniffysko,
Попробуй в конструкторе заинжектить ChangeDetectorRef сервис и вызвать cd.markForCheck() или cd.detectChanges() между 16 и 17 строчкой. Код вообще рабочий? |
Цитата:
Моя проблема заключается в том, что this.componentData НЕ обновляется после 6 строки первого блока кода. Т.е. код не работает. Не работает в том плане, что не происходит обновления this.componentData через ссылку на один из узлов в виде переменной oldItem. Т.е. по сути вопрос не имеет отношения к Angular, а больше к базовому JS. В моем понимании должно было работать так: 1. Строка 3 -- находим ссылку на узел в дереве (oldItem). Работает. 2. Присваиваем новое значение переменной oldItem, и, поскольку она есть ссылка, одновременно обновляется значение уза в дереве componentData. Работает не так как надо: oldItem переприсваивается и получает новое значение, а componentData не обновляется. |
Цитата:
this.componentData.unshift(incomeItem) |
Немножко не то. Нужно обновить/добавить элемент дерева:
interface IUniversalTreeNode {
id: number;
name: string;
children?: IUniversalTreeNode[];
}
Что сути проблемы не меняет. :о( А строка this.componentData = [...this.componentData] просто перегенерит объект. Перепишу пример по другому:
function RandomFillItemsList() {
let res = [];
for(count = 0; count < 10; count++){
res.push({
num: count * 100,
id: count * 10
});
}
return res;
}
let itemList = [];
itemList = RandomFillItemsList();
let selectedItem = itemList[0];
console.log(itemList, selectedItem);
selectedItem = {num: 0, id: 0};
console.log(itemList, selectedItem);
Хочу, чтобы itemList[0] стал равным {num: 0, id: 0}. Понимаю, что вопрос базовый, и мне жутко стыдно, но как переприсвоить элемент по ссылке?:) |
Цитата:
|
Цитата:
Но возвращаясь к сути своего вопроса, порывшись в интернетах нашел, что так как я хочу сделсть нельзя. Весь алгоритм сводится к томы, что необходимо найти нужный объект, и найдя его в структуре, тут же обновить. |
sniffysko,
вообще если долго не думать, 6 строку так перепишите Object.keys(incomeItem).forEach(key => oldItem[key] = incomeItem[key]); |
Ключевой момент заключается в том, что это не массив, а дерево.
Решение для этого случая уже придумал, но главным разочарованием стало то, что oldItem = incomeItem не сработало. Спасибо за участие и советы. Пошел писать кот. |
| Часовой пояс GMT +3, время: 00:55. |