Как наблюдать за изменениями в массиве объектов

Javascript теперь реализует Object.observe и Array.observe, однако я не могу найти способ объединить эти функции.

То, что я пытаюсь сделать, это иметь массив объектов. Когда какое-либо свойство одного из объектов изменяется, я хотел бы получать уведомления.

Object.observe позволяет мне получать уведомления об изменении свойства определенного объекта.

Array.observe позволяет мне получать уведомления, когда происходит изменение уровня массива.

Если я специально не наблюдаю за каждым элементом массива, у меня нет возможности узнать, когда изменяется конкретное свойство элемента.

Например:

var model = [
  {
    data: 'Buy some Milk',
    completed: false
  },
  {
    data: 'Eat some Food',
    completed: false
  },
  {
    data: 'Sleep in a Bed',
    completed: false
  },
  {
    data: 'Make Love not War',
    completed: false
  }
];

Array.observe(model, function(changeRecords) {
  console.log('Array observe', changeRecords);
});

model[0].data = 'Teach Me to code';
model[1].completed = true;
model.splice(1,1);
model.push({data: "It's a new one!",completed: true});

дает консольный вывод:

Array observe [Object, Object]
  0: Object
    addedCount: 0
    index: 1
    object: Array[4]
    removed: Array[1]
    type: "splice"
    __proto__: Object
  1: Object
    addedCount: 1
    index: 3
    object: Array[4]
    removed: Array[0]
    type: "splice"
    __proto__: Object
length: 2
__proto__: Array[0]

Эти два уведомления относятся конкретно к:

model.splice(1,1);

а также

model.push({data: "It's a new one!",completed: true});

но полностью игнорирую

model[0].data = 'Teach Me to code';

а также

model[1].completed = true;

Есть ли способ наблюдать за каждым изменением, будь то изменение уровня массива или уровня объекта?

Я знаю, что есть библиотеки, которые могут сделать это для меня, однако я хотел бы понять, как реализовать это непосредственно в моем собственном коде.


РЕДАКТИРОВАТЬ: ОК, похоже, я не упустил ни одной магической функциональности, и единственный верный вариант - наблюдать за отдельными элементами массива.

Итак, чтобы расширить исходный вопрос, каков наиболее эффективный метод адаптации массивов для обработки наблюдений за элементами?


person BParker    schedule 06.05.2015    source источник
comment
Наблюдение за объектом строго для каждого объекта (во всяком случае, на данный момент, спецификация все еще находится в стадии разработки). Вам придется самостоятельно добавлять обработчики к каждому объекту.   -  person Pointy    schedule 06.05.2015
comment
Вы можете написать функцию, которая наблюдает за массивом и при изменении типа «добавить» вызывает Object.observe для нового добавленного объекта.   -  person radiaph    schedule 06.05.2015


Ответы (1)


Наблюдение за массивом наблюдает за изменениями массива! Вам также нужно наблюдать за каждым объектом внутри массива, используя Object.Observe!

Посмотри это

      function ObserveMyArray(myArray){
       var arr=myArray||[];
          for(var i=0;i<arr.length;i++){
            var item=arr[i];

        Object.observe(item , function(changes){

          changes.forEach(function(change) {
               console.log(change.type, change.name, change.oldValue);
           });

          });
         } 
       Array.observe(arr, function(changeRecords) {
         console.log('Array observe', changeRecords);
       });
        }
person Bellash    schedule 06.05.2015
comment
MDN заявляет, что эта функция устарела, есть идеи. Как отслеживать изменения в массиве? - person Sirwan Afifi; 12.01.2017