Как получить удаленный или вставленный элемент из массива прокси?
Я пытаюсь обнаружить изменения в массиве объектов, используя прокси JavaScript.
Проблема: Каждый раз, когда происходит изменение в массиве, например, удаление или вставка, я хочу получить этот удаленный или вставленный элемент.
Текущий код
target = [{ id: 1, a: 'a' }, { id: 2, a: 'b' }];
proxy = new Proxy(target, {
get: function (target, property: string, receiver) {
if (property === 'pop') {
console.log('deleted object', target[target.length - 1]);
}
console.log('get', property);
// property is index in this case
return target[property];
},
set: function (target, property, value, receiver) {
console.log('set', property, 'to', value);
target[property] = value;
// you have to return true to accept the changes
return true;
}
});
Текущие мысли: я сделал небольшой обходной путь, чтобы получить удаленный элемент из массива, но он работает только для pop()
метод, потому что он удаляет последний элемент из массива. Но мне нужен способ получить изменения, даже если они сделаны с использованием splice
метод или push
или же pop
,
Благодарю.
[Обновление]Решение, которое я нашел:
https://github.com/ElliotNB/observable-slim Я использовал эту библиотеку для обнаружения изменений в массиве, я также могу обнаружить изменения вложенных свойств в массиве. Это именно то, что я искал.
Я использую эту библиотеку потому, что она использует прокси.
3 ответа
Я рекомендую не выставлять фактическую цель на геттер. Вы можете создать функцию-оболочку для поддержки модификатора cutosom. Посмотрите на приведенный ниже пример.
Я надеюсь, что это поможет. отредактированный
var target = [2, 5, 7];
target.oldPop = Array.prototype.pop;
target.oldPush = Array.prototype.push;
target.oldSlice = Array.prototype.slice;
target.pop = function() {
var elem = this.oldPop();
console.log("deleted element: " + elem);
return elem;
}
target.push = function(...items) {
var len = this.oldPush(...items);
console.log("Inserted element: " + items);
return len;
}
target.slice = function(start, end) {
var new_arr = this.oldSlice(start, end);
console.log("Array sliced.");
return new_arr;
}
target.slice();
Пожалуйста, спросите, если какой-либо запрос:)