1

刚开始使用re-frame,遇到以下困难。我有一个组件(Form-2),它采用一个 arg,reaction基于它创建,并像这样返回渲染器

(defn some-list [some]
  (let [bars (rf/subscribe [:bars (:id @some)])]
    (fn [some]
      [:ul
       (for [[id b] bars]
         [:li (:name b)])])))

后来我称之为

(defn some-dashboard [some]
  [:div.some-dashboard
   [some-list some]])

some是反应。在这里,当我用它调用some-list时,[]它绑定到初始,some因此在订阅中bars始终具有相同(:id @some)的订阅并从订阅中获得相同的值。

你能告诉我如何解决吗?提前致谢。

4

1 回答 1

1

在 clojure slack 社区上找到答案。

原来是动态订阅https://github.com/Day8/re-frame/pull/108。公关来了。

解决方法是:

  • 将@some中的数据放入app-db ....
  • 因此可以在处理程序本身中访问它

代码

(defn some-list []
  (let [bars (rf/subscribe [:bars])]
    (fn []
      [:ul
       (for [[id b] @bars]    ;;   <---------- remember the @
         [:li (:name b)])])))

(register-sub 
   :bars
   (fn [db _] 
     (let   [some   (reaction (get @db :some)]  
        (reaction  (get-in @db [:bar @some] ))))
;; we should NOT be using the name "some" ... I'm only doing it so it relates back to your question

这就是动态订阅将如何解决这个问题(取自此处)。原始示例在这里找到。

(defn some-list [some]
  (let [some-id (reaction (:id some))
        bars (rf/subscribe [:bars] [some-id])]
    (fn [some]
      [:ul
       (for [[id b] @bars]
         [:li (:name b)])])))

这就是订阅者的外观(与上面提交消息中的代码完全相同):

(rf/register-sub
  :bars
  (fn [db _ [some-id]]
    (reaction (get-bars @db some-id))))

自己注意:移动到下一个重新框架版本时,不要忘记删除生成的 js 文件。

于 2015-08-27T08:20:29.163 回答