我在使用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
下的当前实例。
答案 0 :(得分: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 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
引用了传递的第一个参数(可以是任何对象)。