1

リフレームを使い始めたばかりで、次のような問題が発生しました。私は1つの引数を取り、それに基づいて作成し、このようなレンダラーを返すコンポーネント( Form-2 )を持っています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 community で回答が見つかりました。

動的サブスクリプションhttps://github.com/Day8/re-frame/pull/108であることが判明しました。PRが来ています。

回避策は次のとおりです。

  • @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

これが、動的サブスクリプションがこの問題を解決する方法です (ここから取得)。元の例はhere にあります

(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 に答える