javascript - 在 dojo 内部调用对象方法

标签 javascript dojo

我正在尝试创建一个包含函数的 dojo 类,这些函数依次调用此类中的其他函数,如下所示:

dojo.provide("my.drawing");
dojo.declare("my.drawing", null, {
    constructor: function(/* Object */args){
        dojo.safeMixin(this, args);
        this.container = args[0];    
    },

    addPoint: function(event){
            //calculate the x and y values by offsetting correctly
            var pos = dojo.coords(container);
            var x = event.clientX - pos.x;
            var y = event.clientY - pos.y;
            this.addAbsPoint(x,y);
      },

    addAbsPoint: function(x,y){
        //do something here with the absolute x and y values
    }
});

上面的( trim 过的)代码是在 dojo.gfx 表面上添加一个点。当我尝试运行它时,出现以下控制台错误:

Uncaught TypeError: Object #<an HTMLDivElement> has no method 'addAbsPoint'

函数 addPoint(event) 被正确调用,但当它试图在同一对象中引用函数 addAbsPoint(x,y) 时失败。这在道场可能吗?我怎样才能完成它?

最佳答案

addPoint() 未在正确的上下文中正确调用。从它的签名来看,我的通灵能力告诉我你将它用作事件处理程序,但你没有正确地使用它。

你这样做:

var myDrawing = new my.drawing(someArgs);

// this is incorrect:
dojo.connect(someDomNode, "onclick", myDrawing.addPoint);

// or, less incorrect, yet incorrect too:
surface.connect("onclick", myDrawing.addPoint);

在 JavaScript 中,上面的行传递了一个函数,而不是您期望的绑定(bind)方法。您需要传递一个上下文(一个调用函数的对象):

// the node connection:
dojo.connect(someDomNode, "onclick", myDrawing, "addPoint");
// or:
dojo.connect(someDomNode, "onclick", myDrawing, myDrawing.addPoint);

// the surface connection:
surface.connect("onclick", myDrawing, "addPoint");
// or:
surface.connect("onclick", myDrawing, myDrawing.addPoint);

或者,您始终可以使用 dojo.hitch() 使用闭包来绑定(bind)上下文/作用域(通过上面的示例完成:

var boundMethod = dojo.hitch(myDrawing, "addPoint");
// or:
//var boundMethod = dojo.hitch(myDrawing, myDrawing.addPoint);

// and now you can do like you did originally:
dojo.connect(someDomNode, boundMethod);

// or:
surface.connect("onclick", boundMethod);

阅读文档中的所有内容:

关于javascript - 在 dojo 内部调用对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3188816/

相关文章:

javascript - 在 asp.net 中使用 javascript 验证特定范围值的文本框

javascript - react 原生 "Invariant Violation: Module AppRegistry is not a registered callable module (calling runApplication)"

javascript - 用于验证电话号码扩展的正则表达式

dojo - 关闭 Dojo 中的所有模态对话框

css - 更改 dijit 布局选项卡容器的选项卡颜色

javascript - 调整 Dojo 中多选组合框的排序

dojo - fileuploader.swf的来源在哪里?

zend-framework - 布局中的 Zend_Dojo_Form

javascript - 需要另一个帮助来动态地在屏幕上显示文本

javascript - 如何在javascript中组合函数名称?