2017-08-30 3 views
8

Ich habe versucht, diese example in Google Diagramm anzupassen. Um re-frame Rahmen, reagent. Ich möchte basierend auf Abonnements ein Echtzeitdiagramm erstellen. Ich habe mit einem einfachen Zähler = + - 1 getestet.Google Diagramm CLJS Clojure

Ich habe Fehler: Assert failed: Render must be a function, not nil (ifn? render-fun).

(defn draw-demo-chart 
    [d] 
    (let [[columns vectors options chart] (r/children d) 
     data (new js/google.visualization.DataTable)] 
     (doall ;gotta keep the doall on maps. lazy sequence... 
     (map (fn [[type name]] 
      (.addColumn data type name)) columns)) 
     (.addRows data vectors) 
     (.draw chart data options) 
     (.load js/google "visualization" "1" (clj->js {:packages ["corechart" "orgchart" "calendar" "map" "geochart"]}))  
     (.setOnLoadCallback js/google draw-demo-chart) 
    )) 


(defn draw-demo-chart-container 
    [] 
    (let [count (re-frame/subscribe [:count]) 
      columns (reaction [["date" "X"] ["number" "Y"]]) 
      vectors (reaction (clj->js [[(new js/Date "07/11/14") 145] [(new js/Date "07/12/14") 15] 
             [(new js/Date "07/13/14") 23] [(new js/Date "07/14/14") 234]])) 
      options (reaction (clj->js {:title (str @count)})) 
      chart (reaction (new js/google.visualization.LineChart (.getElementById js/document "linechart"))) ] 
    (fn [] 
     [draw-demo-graph @columns @vectors @options @chart]))) 

(def draw-demo-graph 
     (r/create-class {:reagent-render draw-demo-chart 
         :component-did-mount draw-demo-chart 
         :component-did-update draw-demo-chart})) 
+0

Es ist nicht so aussieht, wenn man ganz den richtigen Ansatz. Dieses Tutorial sollte Sie zu den notwendigen Verbesserungen führen: https://github.com/Day8/re-frame/blob/master/docs/Using-Stateful-JS-Components.md –

+0

Wie ich gepostet habe .. das funktioniert mit d3. js, Ich möchte nur die Google Chart Version erstellen. Ich weiß nicht, was das Problem ist, denn bei d3.js Version habe ich die Daten zurück. Problemlos. Bei Google Chart Fall .. nicht. Ich bin aus vielen Foren zurück, die verlinken .. nur verstehe ich nicht, warum funktioniert nicht mit Google Chart diese Methode ... wo ist der Fehler von meiner Seite: s – RRR

Antwort

5

Es gibt mehrere Herausforderungen mit dem Google Charts API:

  1. Es asynchron geladen und kann nur, wenn Sie bereit verwendet werden.

Ich empfehle die Verwendung eines Flags, um aufzuzeichnen, ob die API bereit ist oder nicht, damit es auch dann rendern kann, wenn die API nach dem Mounten der Komponente geladen wird.

(defonce ready? 
    (reagent/atom false)) 

(defonce initialize 
    (do 
    (js/google.charts.load (clj->js {:packages ["corechart"]})) 
    (js/google.charts.setOnLoadCallback 
     (fn google-visualization-loaded [] 
     (reset! ready? true))))) 
  1. Sie müssen draw auf einem HTML-Elemente nennen:

Das HTML-Element wird nur bestehen, wenn das Bauteil montiert ist. Sie können eine ref verwenden, um das HTML-Element bequem zu erhalten (andernfalls müssen Sie entweder einen Verweis auf in mount speichern oder danach suchen).

(defn draw-chart [chart-type data options] 
    [:div 
    (if @ready? 
    [:div 
     {:ref 
     (fn [this] 
     (when this 
      (.draw (new (aget js/google.visualization chart-type) this) 
        (data-table data) 
        (clj->js options))))}] 
    [:div "Loading..."])]) 

Sie werden jederzeit einen der Eingänge Änderung neu gezeichnet werden soll (die die oben ref Beispiel der Fall ist).

  1. die Datenquelle einrichten

ich eine bequeme Methode vorschlagen, die Datenquelle für das Erhalten:

(defn data-table [data] 
    (cond 
    (map? data) (js/google.visualization.DataTable. (clj->js data)) 
    (string? data) (js/google.visualization.Query. data) 
    (seqable? data) (js/google.visualization.arrayToDataTable (clj->js data)))) 

Jetzt können Sie Ihr Diagramm mit reaktiven Werten verwenden!

[draw-chart 
    "LineChart" 
    @some-data 
    {:title (str "Clicks as of day " @day)}] 

Voll Code Auflistung ist bei https://github.com/timothypratley/google-chart-example