我在forEach
循环中创建按钮但是当我尝试为按钮的onClick
标记设置函数时,它表示this.foo()
不是函数。代码如下:
dojo.forEach(buttonIds, function(btn, i) {
var button = new dijit.form.Button({
id: buttonIds[i]+'.'+widgetId,
label: buttonLabel[i],
onClick: function () {
dojo.hitch(this, this.foo());}
});
现在也许dojo.connect()
更合适,但我不知道如何将按钮ID作为第一个参数,因为如果我理解正确,那么connect会看起来像dojo.connect(button.id, 'onClick', this, foo())
。不幸的是,这个陈述也会导致同样的错误。这可能是一个微不足道的范围问题,但我在道场很新,所以任何帮助都会被贬低!
编辑:对于dojo.connect()
抱歉,错误为button is undefined
答案 0 :(得分:1)
我认为连接应该如下:
dojo.connect(dijit.byId(buttonIds[i]+'.'+widgetId), 'onclick', this.foo);
在'onclick'中注明小写'c',在foo之后没有'()'。
对于按钮构造函数中的onClick
参数,dojo.hitch
接受并返回一个在第一个参数范围内执行的函数,所以:
onClick:dojo.hitch(this, this.foo);
应该有效
你试图阻止执行函数而不是函数本身(注意函数名后没有'();'
答案 1 :(得分:1)
dojo.forEach
实际上接受了三个参数(source):
dojo.forEach方法接受三(3)个参数:一个数组 迭代,一个函数(或回调)来调用每个项目 数组(包括已分配的索引之间未分配的索引,如 如上所述)和一个可选对象,用作其中的范围 拨回电话。
this
dojo.hitch
指向回调函数,添加this
作为第三个参数:
dojo.forEach(buttonIds, function(item, index, items) { /*callback*/ }, this);
// or alternatively
var self = this;
dojo.forEach(buttonIds, function(item, index, items) { /*use self instead of this here*/ });
我不确定你要实现什么,但这是我的猜测:
dojo.require("dijit.form.Button");
dojo.ready(function() {
dojo.declare("Spam", null, {
constructor: function() {
this.buttonIds = ["button1", "button2", "button3"];
},
createButtons: function() {
dojo.forEach(this.buttonIds, function(item, index, items) {
var button = new dijit.form.Button({
id: item,
label: item
});
button.onClick = dojo.hitch(this, "foo", button);
button.placeAt(dojo.body());
}, this);
},
foo: function(widget, event) {
console.log(widget.id);
}
});
var spam = new Spam();
spam.createButtons();
});
在jsFiddle中查看它:http://jsfiddle.net/phusick/mcnjt/