Почему я получаю No protocol method INotify.-notify! при вызове обновления! или сделка! на курсор?

При использовании om (до om-next) я получаю сообщение об ошибке при попытке внести обновления вне фазы рендеринга:

cljs.user=> (require '[om.core :as om :include-macros true])
cljs.user=> (def state (atom {:foo {:bar true}}))
#'cljs.user/state
cljs.user=> (def state-cursor (om/root-cursor state))
#'cljs.user/state-cursor
cljs.user=> (om/update! state-cursor [:foo :bar] false)
#object[Error Error: No protocol method INotify.-notify! defined for type cljs.core/Atom: [object Object]]

Error: No protocol method INotify.-notify! defined for type cljs.core/Atom: [object Object]
    at cljs$core$missing_protocol (http://localhost:10555/js/out/cljs/core.js:290:9)
    at om$core$_notify_BANG_ (http://localhost:10555/js/out/om/core.js:841:34)
    at om$core$notify_STAR_ (http://localhost:10555/js/out/om/core.js:2518:30)
    at om$core$transact_STAR_ (http://localhost:10555/js/out/om/core.js:1070:29)
    at om.core.MapCursor.om$core$ITransact$_transact_BANG_$arity$4 (http://localhost:10555/js/out/om/core.js:2042:31)
    at om$core$_transact_BANG_ (http://localhost:10555/js/out/om/core.js:770:15)
    at Function.om.core.transact_BANG_.cljs$core$IFn$_invoke$arity$4 (http://localhost:10555/js/out/om/core.js:4074:32)
    at om$core$transact_BANG_ (http://localhost:10555/js/out/om/core.js:4044:31)
    at Function.om.core.update_BANG_.cljs$core$IFn$_invoke$arity$3 (http://localhost:10555/js/out/om/core.js:4135:31)
    at om$core$update_BANG_ (http://localhost:10555/js/out/om/core.js:4105:29)

Вместо ошибки: Error: No protocol method INotify.-notify! defined for type cljs.core/Atom я ожидаю, что это обновит атом state до (atom {:foo {:bar false}}). Как я могу это исправить?


person Steven Oxley    schedule 17.02.2016    source источник


Ответы (1)


Проблема заключалась в том, что мне нужно было вызвать (om/ref-cursor) для корневого курсора, прежде чем передать его om/transact! или om/update!. Выполнение этого исправило мою проблему:

cljs.user=> (def state (atom {:foo {:bar true}}))
#'cljs.user/state
cljs.user=> (def state-cursor (om/root-cursor state))
#'cljs.user/state-cursor
cljs.user=> (om/update! (om/ref-cursor state-cursor) [:foo :bar] false)
nil
cljs.user=> state
#object [cljs.core.Atom {:val {:foo {:bar false}}}]
person Steven Oxley    schedule 17.02.2016