dojo.declare创建的对象如何访问自己的属性?

时间:2013-10-16 07:47:17

标签: javascript dojo declare

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

我创建了以下模块:

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'实例。< / p>

我很困惑。我怎样才能引用'my.widget'实例?在Dojo类中,我已经阅读了this下的当前实例。

2 个答案:

答案 0 :(得分:1)

如果您想要使用正确的范围致电newItem,可以使用dojo/_base/langhitch()功能。

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 article中所读到的,它接受上下文和参数。因此,在this执行时,它实际上会更改newItem引用。

答案 1 :(得分: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.hitch的匿名函数中,this引用了传递的第一个参数(可以是任何对象)。