2013-07-29 34 views
1
var resultItemView = Marionette.CompositeView.extend({ 
     render : function(){    
      google.load("visualization", "1", {packages:["table"], callback: function() {  
        var self = this;  
        this._drawVisualization(self); 
      }}); 
     }, 

     _drawVisualization : function(self){ 
      var data = new google.visualization.DataTable(); 

      //Here i'm creating data table ... 

      var chart = new google.visualization.LineChart(self.$el.find("#graphDiv")); 
      chart.draw(data, null, null);    

     }, 
     return resultItemView; 
    }); 

在渲染函數中,正在加載google可視化並在回調函數中調用drawVisualization。另外,我將「this」對象作爲參數傳遞給此函數。爲此,我使用了匿名函數。在drawVisualization函數中,self等於這個「this」對象。但是我得到這個錯誤:「Uncaught TypeError:Object [object global] has no method'_drawVisualization'」。我究竟做錯了什麼?我如何糾正它?感謝幫助。Uncaught TypeError:Object [object global]沒有方法

回答

6

您需要將var self = this;放在致電google.load之外。

var resultItemView = Marionette.CompositeView.extend({ 
     render : function(){  
      var self = this;  
      google.load("visualization", "1", {packages:["table"], callback: function() {  

        self._drawVisualization(self); 
      }}); 
     }, 

這是因爲你傳遞一個回調參數google.load匿名函數將在不指定this上下文中調用 - 這樣將是全球(窗口)對象。 在render函數內部,您將擁有正確的this,並且可以將其存儲在變量self中以在您的回調函數中引用它。

編輯: 另外,如果你這樣做,你不需要通過this上下文的_drawVisualization方法了。完整示例:

var resultItemView = Marionette.CompositeView.extend({ 
     render : function(){ 
      var self = this;   
      google.load("visualization", "1", {packages:["table"], callback: function() {  
       self._drawVisualization(); 
      }}); 
     }, 

     _drawVisualization : function(){ 
      var data = new google.visualization.DataTable(); 

      //Here i'm creating data table ... 

      var chart = new google.visualization.LineChart(this.$el.find("#graphDiv")); 
      chart.draw(data, null, null);    

     }, 
     return resultItemView; 
    }); 
相關問題