Как уведомить подписчиков о мутировании экземпляра класса, хранящегося в магазине
Я могу хранить объект в магазине и видоизменять его путем клонирования и замены объекта, например:
$store = someObject; // Notifies subscribers if someObject was not already the value of the store
someObject.property = newValue;
$store = {...someObject}; // Notifies subscribers because we're assigning a new object
Однако это не работает для экземпляра класса, потому что прототип (методы) не копируются. Магазин заканчивается объектом, а не экземпляром класса.
Я ищу способ вызвать уведомление после мутации, например:
$store = someClassInstance;
someClassInstance.mutateSomeProperties();
store.forceUpdate();
Мои эксперименты зовут store.set()
а также store.update()
не могут уведомить подписчиков об изменении, предположительно потому, что (как указано в документации) это происходит только при изменении устанавливаемого значения. Хотя меня смущает этот пиар, который, кажется, противоречит этому, и дает мне некоторую надежду на то, что есть способ добиться этого.
1 ответ
Я думаю, что у меня есть не слишком хакерское решение, но если это единственный способ, я думаю, было бы лучше поддержать эту возможность в API магазина.
Сейчас я оборачиваю объект-экземпляр в прокси-объект и заменяю последний. Значит, у меня есть лишнее снятие ссылки, но это не так страшно:
$store = {theInstance: someClassInstance}; // Notifies subscribers
someClassInstance.mutateProperties();
$store = {theInstance: someClassInstance}
И использовать store
:
$store.theInstance.doStuff();
Хотя вам может потребоваться быть осторожным, используя это в сценариях компонентов, если вы получаете ошибки, связанные с undefined
. В этом случае проверьте$store && $store.theInstance
Перед использованием.