首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置组件数据中缺少密钥的初始状态

设置组件数据中缺少密钥的初始状态
EN

Stack Overflow用户
提问于 2015-10-28 20:32:41
回答 1查看 181关注 0票数 3

我正试着进入ClojureScript和Om。有一个特殊的案子让我绕着圈跑。

我有一个组件,它首先在没有键的情况下呈现。

代码语言:javascript
复制
(defn model-view [data owner]
  (reify
    om/IWillMount
    (will-mount [_]
      (om/transact! data [:stats] (fn [] {}))
      (go
        (let [response ((<! (api/get-stats (data :id))) :body)
              stats (:stats response)]
          (om/update! data [:stats] stats))))
    om/IRender
    (render [_]
      (dom/div nil
               (dom/h3 nil (data :title))
               ;; Here I want to use the :stats key in data that I
               ;; queried for in IWillMount, but its not present
               ;; the first time this model is rendered. It's only present
               ;; AFTER IWillMount has ran.
               (om/build model-stats-view (data :stats)))))

当第一次调用该组件时,:stats键根本不存在于data中。这就是为什么我要做一个API调用来获得它的统计数据。但是function仍然调用render函数,因此组件崩溃。

如何在这个组件中设置一个初始状态,为data提供一个名为:stats的空映射,从而避免试图在(om/build model-stats-view)调用中呈现nil

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 13:01:46

我更喜欢在init状态下进行所有初始化,然后在呈现状态下访问它。我在我的坐骑上放了一圈。当您在go-循环中更新init状态(即:e-map)时,它会强制调用来呈现/重新呈现组件。我在我的所有组件中使用这个来进行组件间/组件内消息传递。只要把东西推到酒吧/分频道,我们就可以开始比赛了。

代码语言:javascript
复制
;To update my state I use a function:

(defn set-owner-state! [owner old-map-key old-map new-map]
   (om/set-state! owner {old-map-key (merge old-map new-map)}))

om/IInitState
(init-state [_]
  (println "queue->init-state")
  {:e-map {:active-fsm nil}})

om/IDidMount
(did-mount [_]
    (go-loop []
        (let [[v _] (alts! [server-fsm-events dispatcher-events])
              current-state (om/get-state owner)
              e-map (:e-map current-state)]
        ; what goes in here is the logic to respond to a message
        ; in my case I have a match, it could be a cond or a set of
        ; if's.
        (set-owner-state! owner :e-map e-map {:active-fsm :active :task-paths nil})
    ...

om/IRenderState
(render-state [_ {:keys [e-map]}]
  (println "e-map:" e-map)
  ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33401065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档