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

时间:2014-02-19 12:28:01

标签: 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(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链接

2 个答案:

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

在此处查看http://fiddle.jshell.net/eL7mB/11/

答案 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>