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

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

$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() не могут уведомить подписчиков об изменении, вероятно, потому, что (как указано в документах ) это происходит только при изменении устанавливаемого значения. Я, однако, смущен этим PR , который, кажется, противоречит этому и дает мне некоторую надежду, что есть способ достичь этого.

1 Ответ

0 голосов
/ 27 марта 2020

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

Что я сейчас делаю, так это оборачиваю экземпляр объект в прокси-объект и замена последнего. Это означает, что у меня есть дополнительная де-ссылка, но это не так страшно:

$store = {theInstance: someClassInstance}; // Notifies subscribers
someClassInstance.mutateProperties();
$store = {theInstance: someClassInstance}

И использовать store:

$store.theInstance.doStuff();

Хотя, возможно, вам нужно быть осторожным используя это в компонентных скриптах, если вы получаете ошибки, связанные с undefined. В этом случае проверьте $store && $store.theInstance перед использованием.

...