1

我正在使用谷歌地图绘图管理器来编写一个控件类。但是这条线发生了javascript错误。

// Switch back to non-drawing mode after drawing a shape.
this.drawingManager.setDrawingMode(null);

未捕获的类型错误:无法调用未定义的方法“setDrawingMode”

有人可以帮我解决这个错误吗?非常感谢!

function DrawingManagerCtrl() {
    this.drawingManager = new google.maps.drawing.DrawingManager({
        // drawingMode: google.maps.drawing.OverlayType.MARKER,
        drawingControlOptions : {
            position : google.maps.ControlPosition.TOP_CENTER,
            drawingModes : [ google.maps.drawing.OverlayType.RECTANGLE ]
        },
    });

    google.maps.event.addListener(this.drawingManager, 'overlaycomplete', function(e) {
        // Switch back to non-drawing mode after drawing a shape.
        this.drawingManager.setDrawingMode(null);
    });
};

DrawingManagerCtrl.prototype = {
    drawingManager : null,
};
4

2 回答 2

0

我不知道那个特定this的 API,但我怀疑事件处理函数内部与this外部不同,因此您需要使用创建闭包的事实:

function DrawingManagerCtrl() {
    var self = this; // <==== Create a variable for the closure to close over
    this.drawingManager = new google.maps.drawing.DrawingManager({
        // drawingMode: google.maps.drawing.OverlayType.MARKER,
        drawingControlOptions : {
            position : google.maps.ControlPosition.TOP_CENTER,
            drawingModes : [ google.maps.drawing.OverlayType.RECTANGLE ]
        },
    });

    google.maps.event.addListener(this.drawingManager, 'overlaycomplete', function(e) {
        // Switch back to non-drawing mode after drawing a shape.
        self.drawingManager.setDrawingMode(null);
        // ^ Use it
    });
};

this在 JavaScript 中,取决于函数的调用方式,而不是函数的定义位置。所以除非谷歌地图的东西让你指定它应该this在事件回调中使用什么,this否则不会引用你的对象。通过使用闭包,您可以改用变量(self上面的 , )。

进一步阅读(在我贫血的小博客上):

于 2012-11-19T16:18:28.550 回答
0

您在 google map api 中附加库时可能犯了错误。

请确保您已将几何库添加到脚本文件中

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places,geometry,drawing"></script>
于 2015-02-10T08:08:12.333 回答