Другими словами, как я могу вызвать обратный вызов при изменении атрибута объекта?
Это общее решение вышеуказанного вопроса. Если вам нужно решение для конкретного случая использования c только для массива a
, игнорируйте это.
Проверьте Прокси ES6 для чего-то более мощного, чем простые методы получения / установки для получения / установить перехват. Возможно, вы захотите рекурсивно обернуть прокси, поскольку у вас есть вложенная структура данных. Примерно так:
function wrapWithProxyCallback(obj, callback) {
return new Proxy(obj, {
get (target, key, receiver) {
const result = Reflect.get(target, key, receiver)
// wraps nested data with Proxy
if (typeof result === 'object' && result !== null) {
return wrapWithProxyCallback(result, callback)
}
return result
},
set (target, key, value, receiver) {
// calls callback on every set operation
callback(target, key, value /* and whatever else you need */)
return Reflect.set(target, key, value, receiver)
}
})
}
И использовать это как:
const wrappedClass = wrapWithCallback(
myClass,
(target, key) => console.log(target[key])
)
// this will call the above callback
wrappedClass.a.push(1);
Это немного наивно, но хорошая общая отправная точка. Возможно, вы захотите проверить, не вложены ли вложенные данные, например, в Прокси.
Что вы хотите сделать, это, вероятно, правильно настроить выравнивание с прозрачной реактивностью (хотя я должен был бы увидеть содержимое вашего обратного вызова, чтобы быть уверенным в этом. Я думаю, вы должны проверить mobx или @ nx-js / наблюдатель-утилита (последний автор - я) для готовых коробочных решений.
Редактировать: Мой первый пример вызвал обратный вызов при операциях get, Я исправил это для запуска на множестве операций.