2014-02-19 44 views
0

我有一个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事件处理程序。我想访问一个名为_ 的methot,计算出表示出的事件处理方法。我想访问查询(this)对象

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

这是jsfiddle链接

回答

0

所以,如果我理解不错,this方面应该是既小部件(用于_calculate()功能)和DOM被点击的节点(query()函数)?

这实在是一个很糟糕的做法。你想用一个上下文来引用两个对象,这不仅听起来不好,而且使你的代码不可读。

只需使用事件处理程序的target属性检索点击的元素,就像这样:

dom.byId("result").innerHTML += query(event.target).parent('li'); 

但是不要忘了,你重写你的#result HTML,因为你使用:

dom.byId("result").innerHTML = ...; 

如果要将其添加到计算的值旁边(100),请使用+=运算符。


小记:您可以使用this上下文窗口小部件并通过两个对象相结合的目标元素都,但就像我说的,这不是一个好主意,这样做。

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/