我有一个dojo模块,我想使用这个关键字,但有一些问题。
require(["dojo/_base/declare", "dojo/_base/lang","dojo/query", "dojo/on",
"dojo/dom", "dojo/NodeList-traverse"],
function(declare, lang, query, on, dom, nls) {
var mainWidget = declare(null,{
constructor:function(){
this.onItemClicked = lang.hitch(this, this.onItemClicked);
on(dom.byId("myList"), ".toggle:click", this.onItemClicked);
},
onItemClicked: function (event) {
dom.byId("result").innerHTML = this._calculate();
dom.byId("result").innerHTML = query(this).parent('li');
},
_calculate:function(){
return 10 * 10;
}
});
var wg = new mainWidget();
});
我想在 onItemClicked 事件处理程序中使用此关键字。我想从事件处理程序方法中访问名为_ calculate 的methot。我想访问查询(this)对象
this._calculate()正在运行,但查询(this)应返回元素但不返回。
这是jsfiddle链接
答案 0 :(得分:0)
您需要以某种方式捕获您想要的上下文。更高阶函数是实现这一目标的好方法:
dojo.connect(window, "onload", function(){
require(["dojo/_base/declare",
"dojo/_base/lang",
"dojo/query",
"dojo/on",
"dojo/dom",
"dojo/NodeList-traverse"],
function(declare, lang, query, on, dom, nls) {
var createBtnClicked = function(context){
return function(){
dom.byId("result").innerHTML = context._calculate();
dom.byId("result").innerHTML = query(this).parent('li');
};
}
var mainWidget = declare(null,{
constructor: function(){
//this.onBtnClicked = lang.hitch(this, this.onBtnClicked);
on(dom.byId("myList"), ".toggle:click, .toggle:keyup", createBtnClicked(this));
},
_calculate:function(){
return 10 * 10;
}
});
var wg = new mainWidget();
});
答案 1 :(得分:0)
因此,如果我理解的话,this
上下文应该是小部件(用于_calculate()
函数)和被点击的DOM节点(用于query()
函数)?< / p>
这真是一个很糟糕的做法。您想使用单个上下文引用两个对象,不仅听起来不好,而且会使您的代码无法读取。
只需使用事件处理程序的target
属性来检索单击的元素,就像这样:
dom.byId("result").innerHTML += query(event.target).parent('li');
但请不要忘记,因为您正在使用,所以覆盖了#result
HTML:
dom.byId("result").innerHTML = ...;
如果要将其添加到计算值(100
)旁边,请使用+=
运算符。
小注释:您可以通过组合这两个对象来使用this
上下文来构建窗口小部件和目标元素,但就像我说的那样,这不是一个好主意。< / p>