链接dojo.connect

时间:2012-03-09 22:16:12

标签: dojo

我发现你不能用一致的行为来连接。在下面的代码中,调用窗口小部件中的onCustomClick方法,但不会调用连接到它的函数。我有的解决方法是我用onCustomClick2做的,我将事件附加到一个简单调用另一个方法的内部方法。有没有办法编写这段代码而不必使用内部方法?

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Dojo Connect Issue</title>
</head>
<body>

<div id="content"></div>

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7/dojo/dojo.js" data-dojo-config="isDebug: true"></script>
<script type="text/javascript">
    require(["dojo/domReady!", "dojo/parser", "dijit/_Widget", "dijit/_Templated"], function(dr, p, w, t) {

        dojo.declare("W1", [w, t], {

            templateString: '<div>Click Me</div>',

            postCreate: function() {
                this.inherited(arguments);
                this.connect(this.domNode, 'onclick', this.onCustomClick);
                this.connect(this.domNode, 'onclick', this._onCustomClick2);
            },

            onCustomClick: function() {
                console.debug('onCustomClick');
            },

            _onCustomClick2: function() {
                this.onCustomClick2();
            },

            onCustomClick2: function() {
                console.debug('onCustomClick2');
            },
        });

        var w = new W1({}, dojo.byId('content'));

        dojo.connect(w, 'onCustomClick', function() {
            console.debug('End Consumer - onCustomClick'); // never gets called???
        });
        dojo.connect(w, 'onCustomClick2', function() {
            console.debug('End Consumer - onCustomClick2');
        });
        w.startup();

    }); 
    </script>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

dojo.connect的工作原理是使用一个新函数重新定义方法,该函数调用旧函数(以及你绑定的方法)所以根据这里的执行顺序,postCreate绑定到onCustomClick方法的一个定义,然后dojo.connect绑定到另一个。尝试使用可以对onCustomClick方法进行惰性查找的连接签名:(使用Craig的更正进行编辑)

dojo.connect(this.domNode, 'onclick', this, 'onCustomClick');

答案 1 :(得分:0)

我认为你采取了错误的做法。如果所有这些事件处理程序都是由同一事件触发的,那么您应该让主事件处理程序触发所有事件处理程序:

postCreate: function() {
  this.inherited(arguments);
  dojo.connect(this.domNode, 'onclick', this, function(event) {
    this.onCustomClick(event);
    this._onCustomClick2(event);
  });
}

另请注意,使用this.connect创建对象时未提供dojo.declare,您仍必须使用dojo.connect

或者,如果链接是你真正想要的,那么尝试将对象包装在dojo.nodeList中,它遵循构建器模式并允许你链接调用(我没有测试过以下内容):

var w = new W1({}, dojo.byId('content'));

new dojo.NodeList(w).
  .connect('onCustomClick', dojo.hitch(w, w.onCustomClick))
  .connect('onCustomClick2', dojo.hitch(w, w.onCustomClick2));

w.startup();