onClick标记内的函数超出了dojo 1.6中的范围

时间:2012-09-18 16:14:02

标签: javascript javascript-events dojo foreach onclick

我在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

2 个答案:

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