由 dojo.declare 创建的对象如何访问自己的属性
How the object created by dojo.declare can access its own properties?
我在使用 Dojo/_base/dedeclare 创建的 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
指向按钮小部件,而不是"my.widget"实例。
我很困惑。如何引用"my.widget"实例?在我读过的 Dojo 类中,当前实例在 this
下可用。
如果要使用正确的作用域调用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
函数来启动魔术。正如您在本文中所读到的,它接受上下文和参数。因此,它实际上会在执行newItem
时更改this
引用。
您可以使用
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
引用传递的第一个参数(可以是任何对象)。
相关文章:
- HTML5拖放访问属性
- 如何从保存在数组某个位置的JSON行访问属性
- webGL,javascript:尝试访问属性1中超出范围的顶点
- 访问属性的权限被拒绝'filepicker_comm_iframe'
- CanvasJS-访问变量-访问属性toString的权限被拒绝
- 错误:访问属性“”的权限被拒绝;文件”;
- 从javascript访问属性多端数组PHP
- 模块中的访问属性(CommonJS 样式)
- 从控制台 js 访问属性
- 相同的域,但仍收到“访问属性'文档'的权限被拒绝”
- 如何在 Javascript 中从函数本身或其副本访问属性
- 属性 Javascript 的访问属性
- 从 CoffeeScript 中类的属性中的方法访问属性的属性
- 通过 attrs.val 或 attrs.$set(attname, val)访问属性
- 使用 WinJS.Class 和访问属性
- Twitch TV API 访问属性名称值并更新它
- 如何访问属性名称中具有特殊字符的javascript对象的属性
- Cordova-不推荐尝试访问属性'userAgent'在非导航器对象上
- 具有私有方法的JS原型类不访问属性
- iFrame中的SelectionContext-访问属性“getSelection”的权限被拒绝