Как уведомить подписчиков о мутировании экземпляра класса, хранящегося в магазине

Я могу хранить объект в магазине и видоизменять его путем клонирования и замены объекта, например:

$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 Перед использованием.

Другие вопросы по тегам