1

戻るボタンと進むボタンをクリックしている間、すべてのページで機能する試薬があります。ただし、ページが更新されると例外がスローされます。

私のアプリは、Firebase とsetsアトムからデータをフェッチします。次に、UI がレンダリングされます。ビューはアトムからデータを取得し、UI をレンダリングします。

しかし、更新すると、Atom が Firebase によって取り込まれる前にページがレンダリングされ、データがまだ利用できないため例外が発生するようです。

注:(println clicked-job uid)マークアップをレンダリングするのではなく、ページを更新するprintlnと、最初nilにデータが返され、2 回目にデータが返されます。

/* Atom */
(def current-view (atom {"jobs-list" {}}))

/* Helper Functions */
(defn set-list! [value]
  (swap! app-state assoc-in ["jobs-list"] value))

(defn clicked-job [uid]
  (get-in @app-state ["jobs-list" uid]))

/* View */
(defn job-view [uid]
  (let [job clicked-job uid)]  
    [:div
      [:div (job "name")]  /***THROWS EXCEPTION HERE***/
      [:a.routes {:href "#/"} "home page"])

/* Fetch data from Firebase and put it in Atom */
(let [fb (js/Firebase. "https://firebaseio.com/listings")]
   (.on fb "value" #(set-list! (js->clj (.val %)))))

/* Set app-view to current-view */
(defn app-view []
    [:div (@data/current-view)])

/* Render app-view */
(reagent/render-component [app-view] (.getElementById js/document "app"))

ページを適切に更新するための助けをいただければ幸いです。

4

2 に答える 2

0

他にできることは、アトムに def の代わりに defonce を使用することです。これにより、ページをリロードしたときにアトム フォームが再定義されるのを防ぐことができます。figwheel ページを見てください。最後に、リロード可能なコードの記述に関する便利なセクションがあります。

于 2015-10-11T08:42:59.487 に答える