3

В моем приложении у меня есть ItemsService, который получает элементы с сервера и сохраняет их как объекты JSON в своей переменной cache. Элементы могут присутствовать во многих местах, например. в таблице или в графике/диаграмме и так далее.Как реализовать двунаправленную связь между двумя массивами?

Например, когда я инициализирую table - мне нужно выбрать только определенные элементы из cache, например. 1-й, 3-й, 7-й.

Как реализовать двунаправленную связь между ними? В основном я хочу, чтобы table содержал ссылки на конкретные предметы от cache, поэтому, когда я меняю элемент либо в cache, либо в table - его состояние будет постоянно синхронизироваться, потому что оно такое же Пункт.

Также, когда я удаляю Товар от table - его необходимо удалить из cache. Relationship between cache and table

Вот пример table и cache структур:

Таблица:

table: { 
    "36": { // it's a name of a row 
     "72": [items], // it's a name of a column with corresponding items 
     "73": [items], 
     "74": [items] 
    }, 

    "37": { 
     "72": [], 
     "73": [items], 
     "74": [items] 
    }, 
    "38": { 
     "72": [], 
     "73": [], 
     "74": [] 
    } 
} 

кэш ItemsService (упрощенный вариант):

ItemsService = { 
    cache: [items] 
}; 

структура товара:

{ 
    id: 3, 
    parent_id: 1, 
    name: 'First Item', 
    siblings: [1,2,3], 
    active_users: [{user_id: 1, avatar_url: 'http://...'}, ...], 
    // 50 more fields :) 
} 

необходимо также отметить, что я использую angular-ui-sortable плагин, чтобы перетаскивание элементов между столбцами/строками, и мне нужно, чтобы обеспечить ng-model с массивом (Я думаю). Вот как это выглядит прямо сейчас:

<td ui-sortable="vm.sortableOptions" 
    ng-model="vm.table[row.id][column.id]"> 
    <sb-item itemid={{item.id}} 
      ng-repeat="item in vm.table[row.id][column.id]"> 
    </sb-item> 
</td> 
+0

Вы должны показать нам обе структуры массивов, поскольку существует так много способов сделать это, что это будет зависеть от того, как их структуры. – Buzinas

+0

Я предусмотрел структуры – yaru

+0

Структура 'items' является самой важной. – Buzinas

ответ

1

Если только по какой-то причине вы должны использовать два отдельных массивы, вы рассмотрели с использованием filter?

+0

Я не рассматривал использование фильтра. Нужно подумать об этом подходе ... – yaru

1

Ваш лучший выбор - это объекты. Переменные, которые хранят объекты в javascript, на самом деле не содержат объект, а ссылку на указанный объект. Когда вы передаете эту переменную в другую, ссылочное значение копируется, поэтому обе переменные указывают на один и тот же объект.

var a = { 0: 'Property 0' }; 
var b = a; 
b[0] = 'Property 0!'; //a[0] also the same. 
delete b[0]; //a[0] nor b[0] exist anymore. 
0

Использование объектов (а не JSON) будет работать.

Затем ваш кеш и ваша таблица указывают на одинаковые объекты предметов. Если вы что-то изменяете в объекте, оно отражается на обоих концах.

var cacheArray = [{ item: 1 }, { item: 2}]; 
table[0][0] = cacheArray[0]; 
console.log(table[0][0].item); // 1 
cacheArray[0].item = 9; 
console.log(table[0][0].item); // 9. 

Обратите внимание: массив и таблица не изменены. Они все же указывают на те же объекты.