我发现你不能用一致的行为来连接。在下面的代码中,调用窗口小部件中的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>
答案 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();