Javascript 当我刷新试剂页面时,Firebase数据不可用,因此我得到一个异常

Javascript 当我刷新试剂页面时,Firebase数据不可用,因此我得到一个异常,javascript,clojurescript,om,reagent,Javascript,Clojurescript,Om,Reagent,我有一种试剂,可以在点击后退和前进按钮时在所有页面上工作。但是,当刷新页面时,它会引发异常 我的应用程序从Firebase获取数据并设置atom。然后,随着UI的呈现。视图从atom中获取数据并呈现UI 但当我刷新时,页面似乎是在我的Atom由Firebase填充之前呈现的,这会导致异常,因为数据还不可用 注意:当我刷新页面时,println单击了作业uid,没有呈现标记,println运行两次,第一次返回nil,第二次返回数据 /* Atom */ (def current-view (ato

我有一种试剂,可以在点击后退和前进按钮时在所有页面上工作。但是,当刷新页面时,它会引发异常

我的应用程序从Firebase获取数据并设置atom。然后,随着UI的呈现。视图从atom中获取数据并呈现UI

但当我刷新时,页面似乎是在我的Atom由Firebase填充之前呈现的,这会导致异常,因为数据还不可用

注意:当我刷新页面时,println单击了作业uid,没有呈现标记,println运行两次,第一次返回nil,第二次返回数据

/* 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"))

任何帮助,使页面刷新正确感谢

我需要一个网关来确保在我的状态未就绪时渲染代码不会运行

实现这一点的简单方法是使用if语句。如果我的原子还没有被Firebase点燃,什么都不要做。如果已设置,则渲染视图。由于试剂会在数据更改时自动渲染视图,因此您不必担心任何进一步的连接

下面是一个伪代码示例:

 (if (empty? (data/get-list!))
   (println "True. Atom is empty. Do not start rendering.")
   (render-view)
 )

你可以做的另一件事是在你的原子中使用defonce而不是def。这将防止在重新加载页面时重新定义atom表单。看一看,最后是关于编写可重新加载代码的有用部分