未捕获的类型错误: 对象 [对象全局] 没有方法

Uncaught TypeError: Object [object global] has no method

本文关键字:对象 全局 有方法 类型 错误      更新时间:2023-09-26
    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;
   });

在渲染函数中,正在加载谷歌可视化,并且在回调函数中调用了draw可视化。此外,我将"this"对象作为参数传递给此函数。为此,我使用了一个匿名函数。在drawVisual函数中,self等于这个"this"对象。但是我收到此错误:"未捕获的类型错误:对象[对象全局]没有方法'_drawVisualization'"。我做错了什么?我该如何纠正它?感谢您的帮助。

您需要

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;
   });