【问题标题】:re-frame: subscription not working as expected重新框架:订阅未按预期工作
【发布时间】:2016-06-10 14:44:40
【问题描述】:

从 re-frame 开始并且有一个(可能非常基本的)混淆点。

我有订阅:

(defn get-vote-by-id
  [votes id]
  (filterv #(= (:id %) id) votes))

(register-sub
 :cvs
 (fn cvs-sub [db [_]]
   (make-reaction
    (fn cvs-sub-reaction []
      (let [cv (get-in @db [:current-vote])
            votes (get-in @db [:votes])]
        ;; why is this evaluating to []?
        (get-vote-by-id votes cv))))))

由这个 Form-2 组件使用:

(defn vote-page []
  (let [ready? (subscribe [:current-vote-initialised?])
        current-vote-id (subscribe [:current-vote-id-sub])
        cv (subscribe [:cvs])]
    (fn vote-page-renderer []
      [:div
       [:h2 "Vote"]
       (if @ready?
         (do
           [:div
            [:div (str "cv: " @cv)]
            [:div (str "Current Vote id: " @current-vote-id)]])
         [:div "Initialising..."])])))

我的 app-db 有有效数据,{:votes ... 是地图向量,每个地图都有一个 :id 参数,{:current-vote 是一个数字。

我知道 get-vote-by-id 有效:

(get-vote-by-id [{:id 1 :data "hi"} {:id 2 :data "there"}] 2)
[{:id 2, :data "there"}]

如果我将 (get-vote-by-id votes cv) 中的 cv 替换为一个常量:(get-vote-by-id votes 2),那么它就可以工作。但除此之外, (get-vote-by-id ...) 正在评估一个空向量 []。

任何帮助表示赞赏,并在此先感谢!

这表明 get-vote-by-id 传递了正确的值(投票向量和 id 数字):

【问题讨论】:

  • 你能打印出cvvotesget-vote-by-id 调用之前是什么吗?
  • 当然 - 我在上面添加了一个屏幕截图。这表明 get-vote-by-id 被传递了一个向量(3 个元素,每个元素一个映射)用于投票和一个数字(在本例中为 1)用于 id。
  • 令人困惑的是 - 可以看出 - 它是否返回一个空向量。当从 repl 调用 get-vote-by-id 时,使用相同的值,它的行为与预期一样(返回一个包含我想要的单个地图元素的向量)。

标签: clojurescript re-frame


【解决方案1】:

经过一番调试,我们发现问题出在更上游的地方。根本原因是 id 被设置为字符串。将id 强制转换为整数解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2021-06-05
    相关资源
    最近更新 更多