2012-06-07 19 views
6

मैं अपने backbone.js ऐप में एक Google विज़ुअलाइज़ेशन चार्ट को एकीकृत करने की कोशिश कर रहा हूं। वर्तमान में मेरे पास google.load (विज़ुअलाइज़ेशन) और setOnLoadCallback (DrawVisualization) दोनों चार्टव्यू क्लास के रेंडर फ़ंक्शन में कॉल करते हैं। Google विज़ुअलाइजेशन लाइब्रेरी सही ढंग से लोड होने लगते हैं, हालांकि कॉलबैक कभी निष्पादित नहीं होता है।रीढ़ की हड्डी देखें + google visualization api

नीचे एक उदाहरण है जो समस्या दिखाता है, अगर कोई सहायता कर सकता है तो मैं बहुत आभारी रहूंगा!

<!doctype html> 
<html> 
<head> 
    <title>App</title> 
    <meta charset="utf-8"> 
</head> 
<body> 
<div id="content"></div> 

<script src="lib/jquery-1.7.2.min.js"></script> 
<script src="lib/underscore.js"></script> 
<script src="lib/backbone.js"></script> 
<script src="http://www.google.com/jsapi"></script> 

<script> 

    ChartView = Backbone.View.extend({ 

     render:function() { 
      $(this.el).html('<p>gviz line chart:</p>' + 
        '<div id="gviz" style="width:600px; height:300px;"></div>'); 
      google.load('visualization', '1', {packages:'linechart'}); 
      google.setOnLoadCallback(this.drawVisualization); 
      return this; 
     }, 

     //This never gets called 
     drawVisualization:function() { 
      console.log("In draw visualization"); 
      var data = this.createDataTable('date'); 
      var chart = new google.visualization.LineChart(this.$('#gviz')); 
      chart.draw(data, null, null); 
     }, 

     createDataTable:function (dateType) { 
      console.log("Creating datatable"); 
      var data = new google.visualization.DataTable(); 
      data.addColumn(dateType, 'Date'); 
      data.addColumn('number', 'Column A'); 
      data.addColumn('number', 'Column B'); 
      data.addRows(4); 
      data.setCell(0, 0, new Date("2009/07/01")); 
      data.setCell(0, 1, 1); 
      data.setCell(0, 2, 7); 
      data.setCell(1, 0, new Date("2009/07/08")); 
      data.setCell(1, 1, 2); 
      data.setCell(1, 2, 4); 
      console.log("Created datatable " + data.toJSON()); 
      return data; 
     } 

    }); 

    var AppRouter = Backbone.Router.extend({ 
     routes:{ 
      "":"chart" 
     }, 
     chart:function() { 
      console.log("Showing chart"); 
      $("#content").append(new ChartView().render().el); 

     } 
    }); 

    router = new AppRouter(); 
    Backbone.history.start(); 

</script> 

</body> 
</html> 

उत्तर

12

ठीक है, किसी अन्य महीने से पहले पोस्टरिटी के लिए इसे रिकॉर्ड करने के लिए ठीक है। Google.set का उपयोग करने के बजाए कॉलबैक को google.load कॉल के लिए एक तर्क के रूप में सेट करना संभव है। ऑनलोड लोडबैक विधि। Jquery ऑब्जेक्ट का पहला बच्चा पाने के लिए कोड को ट्विक करना पड़ा और यह ठीक काम करता है।

ChartView = Backbone.View.extend({ 

    render:function() { 
     $(this.el).html('<p>gviz line chart:</p>' + 
       '<div id="gviz" style="width:600px; height:300px;"></div>'); 
     google.load('visualization', '1', {'callback':this.drawVisualization, 
      'packages':['linechart']}); 
     return this; 
    }, 

    drawVisualization:function() { 
     console.log("In draw visualization"); 
     var data = new google.visualization.DataTable(); 
     data.addColumn('date', 'Date'); 
     data.addColumn('number', 'Column A'); 
     data.addColumn('number', 'Column B'); 
     data.addRows(4); 
     data.setCell(0, 0, new Date("2009/07/01")); 
     data.setCell(0, 1, 1); 
     data.setCell(0, 2, 7); 
     data.setCell(1, 0, new Date("2009/07/08")); 
     data.setCell(1, 1, 2); 
     data.setCell(1, 2, 4); 
     var chart = new google.visualization.LineChart(this.$('#gviz').get(0)); 
     chart.draw(data, null, null); 
    } 

}); 
+0

धन्यवाद उपयोग कर सकते हैं - इस दिन को बचाया! – necromancer

0

मैं वर्तमान में GoogleCharts के साथ backbone.js का उपयोग कर रहा हूं। अपनी दृश्य की रेंडर() विधि में Google विज़ुअलाइजेशन लोड करने के बजाय, आप स्क्रिप्ट में अपने backbone.js विचारों के बाहर लोड कर सकते हैं।

<script> 
    google.load('visualization', '1', {packages:'linechart'}); 
    ChartView = Backbone.View.extend({ 

     render:function() { 
      this.drawVisualization(); 
      return this; 
     }, 
     drawVisualization:function() { 
     .... 
     chart.draw(data, null, null); 
     } 
</script> 

यह अभी भी एक अलग त्रुटि दे सकता है। मैंने देखा है कि रेंडर से "chart.draw" को कॉल करना (जिस बिंदु पर दृश्य का 'एल' अभी भी डोम के कारणों का हिस्सा नहीं है, Google चार्ट्स "आपका ब्राउज़र चार्ट का समर्थन नहीं करता" त्रुटि देने के लिए है।

। मैं 'drawVisualization' समारोह क्या आप वाकई देखें 'एल' जैसे के लिए डोम में डाला गया है दृश्य में एक घटना पर (या यह मॉडल है) कर रहे हैं के बाद ट्रिगर करेगा कहते हैं:।

<script> 
    google.load('visualization', '1', {packages:'linechart'}); 
    ChartView = Backbone.View.extend({ 
     events:{ 
      this.model.on('change',this.drawVisualization, this); 
     }, 
     render:function() { 
      this.drawVisualization(); 
      return this; 
     }, 
     drawVisualization:function() { 
     .... 
     chart.draw(data, null, null); 
     } 
</script> 

आशा इस मदद करता है

3

आप निर्भरता प्रबंधन के लिए require.js उपयोग कर रहे हैं, मैंने पाया कि विशिष्ट मॉड्यूल लोड करने के लिए एकल कॉल का उपयोग अच्छी तरह से काम करता है है।

define(
     [ 
     'backbone' 
     , 'socialPages/data/statCollection' 
     , 'date' 
     , 'https://www.google.com/jsapi?autoload={"modules":[{"name":"visualization","version":"1","packages":["corechart","table"]}]}' 
     ], function(
     Backbone 
     , StatsCollection 
     ) { 

return Backbone.View.extend({ 
    initialize: function() { 
     _.bindAll(this 
      , '_chartDataChanged' 
      , '_drawChart' 
      , '_fetchStats' 
      , '_generateFields' 
      , '_generateRows' 
      , '_generateStatsTotals' 
      , '_lineChartOptions' 
      , '_onItemSelected' 
      , '_padWithZeroValues' 
      , '_setChartDimensions' 
      , 'clean' 
      , 'render' 
     ); 

     this._firstRender  = true; 
     this._sampleRate  = 'month'; 
     this.statsCollection = new StatsCollection(); 
     this.dimensions   = this._setChartDimensions(); 
     this.statsCollection.bind('all' , this._chartDataChanged); 
     this._fetchStats(); 
     if(window.google) { 
      google.setOnLoadCallback(this._drawChart); 
     } 

    } 
संबंधित मुद्दे