0

我在使用用 dojo/_base/declare 创建的 Dojo 类对象时遇到了一些概念问题。

我创建了以下模块:

define(["dojo/_base/declare", ....], function(declare,....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

问题是,该函数newItem不起作用,因为当从按钮单击调用它时,它this指向 Button 小部件,而不是“my.widget”实例。

我很困惑。如何引用“my.widget”实例?在我读过的 Dojo 类中,当前实例在this.

4

2 回答 2

1

如果你想newItem用正确的范围调用,你可以使用dojo/_base/lang,hitch()函数。

define(["dojo/_base/declare", "dojo/_base/lang", ....], function(declare, lang, ....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       new Button({onClick: lang.hitch(this, "newItem"}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
});

hitch()函数将确保this引用正确。这听起来像是真正的魔法,但它使用屏幕后面的某种反射来执行该功能。

它真正做的是使用Function.prototype.apply函数来启动魔法。正如您在本文中所读到的,它接受上下文和参数。所以它实际上会在执行this时改变引用newItem

于 2013-10-16T07:54:14.807 回答
0

您可以使用dojo.hitch将上下文附加到函数:

define(["dojo/_base/declare", ....], function(declare,....){
    var myFunc = dojo.hitch(this, function() { 
       this.openDialog({}, this.saveItemCallback)
    });

    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: myFunc,
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

通过这样做,您有效地说明在传递给的匿名函数中dojo.hitchthis是指传递的第一个参数(可以是任何对象)。

于 2013-10-16T07:52:22.453 回答