Как убедиться, что объект смонтирован до того, как другое событие сработает при повторном кадре? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть подписка: show-payme, для которой установлено значение true. Когда для него установлено значение true, подключается div:

(if @(subscribe [:show-payme]
   [:div {:id "#card-element"}]
)

У меня есть событие fx, которое возвращает следующее:

{:db {:show-payme true}
  :dispatch [:load-stripe]}

событие fx load-stripe содержит следующее:

(.mount card-element "#card-element")

Проблема в том, что .mount вызывается до того, как div # card-element когда-либо монтируется на странице, что вызывает ошибку # card-element: элемент не найден. Как мне обойти это?

Поскольку этот метод не работал, я попробовал следующее:

(def load-stripe (with-meta identity {:component-did-mount e/load-stripe}))

и

(if @(subscribe [:show-payme]
   [load-stripe [:div {:id "#card-element"}]]
)

при удалении: load -stripe отправляет событие fx.

Но это все равно дает мне ошибку:

(index):1 Uncaught (in promise) IntegrationError: We could not retrieve data from the specified Element.
              Please make sure the Element you are attempting to use is still mounted.
    at new t (https://js.stripe.com/v3/:1:10981)
    at _o (https://js.stripe.com/v3/:1:53784)
    at e._handleMessage (https://js.stripe.com/v3/:1:60201)
    at e._handleMessage (https://js.stripe.com/v3/:1:27512)
    at https://js.stripe.com/v3/:1:58803
t @ (index):1
_o @ (index):1
_handleMessage @ (index):1
(anonymous) @ (index):1
(anonymous) @ (index):1
Promise.then (async)
eval @ events.cljs:980
eval @ std_interceptors.cljc:149
re_frame$std_interceptors$fx_handler__GT_interceptor_$_fx_handler_before @ std_interceptors.cljc:147
re_frame$interceptor$invoke_interceptor_fn @ interceptor.cljc:71
re_frame$interceptor$invoke_interceptors @ interceptor.cljc:109
re_frame$interceptor$execute @ interceptor.cljc:204
re_frame$events$handle @ events.cljc:65
eval @ router.cljc:179
eval @ router.cljc:198
eval @ router.cljc:146
eval @ router.cljc:169
G__67540 @ router.cljc:187
channel.port1.onmessage @ nexttick.js:218

Что я делаю не так?

...