Javascript 使用此关键字dojo模块事件处理程序

Javascript 使用此关键字dojo模块事件处理程序,javascript,dojo,Javascript,Dojo,我有一个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(nu

我有一个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();   

});
我想在事件处理程序中使用这个关键字。我想访问一个名为“计算”的方法,该方法来自事件处理程序方法。我想访问查询(this)对象

此._calculate()正在工作,但查询(this)应返回元素,但不返回


这是您需要以某种方式捕获所需上下文的链接。高阶函数是实现这一点的好方法:

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();   
});

在这里检查它

因此如果我理解得很好,
这个
上下文应该是小部件(对于
\u calculate()
函数)和被单击的DOM节点(对于
query()
函数)

这真是一个很大的坏习惯。您希望使用单个上下文引用两个对象,这不仅听起来很糟糕,而且会使代码不可读

只需使用事件处理程序的
target
属性检索单击的元素,如下所示:

dom.byId("result").innerHTML += query(event.target).parent('li');
但不要忘记,您正在重写
#结果
HTML,因为您正在使用:

dom.byId("result").innerHTML = ...;
如果要将其添加到计算值旁边(
100
),请使用
+=
运算符


Small note:通过组合两个对象,您可以对小部件和目标元素使用
this
上下文,但正如我所说的,这不是一个好主意