0

我正在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 的新手,所以任何帮助都将不胜感激!

编辑:对不起,dojo.connect()错误是button is undefined

4

2 回答 2

1

我认为连接应该如下所示:

dojo.connect(dijit.byId(buttonIds[i]+'.'+widgetId), 'onclick', this.foo);

注意'onclick'中的小写'c' ,而foo之后没有'()' 。

至于onClick按钮构造函数中的参数,dojo.hitch接受并返回一个在第一个参数范围内执行的函数,因此:

onClick:dojo.hitch(this, this.foo);

应该管用

您试图在函数的执行中而不是函数本身(注意函数名称后没有'();')

于 2012-09-19T04:13:29.667 回答
1

dojo.forEach实际上接受三个参数(source):

dojo.forEach 方法接受三 (3) 个参数:一个要迭代的数组、一个为数组的每个项目调用的函数(或回调)(包括已分配的索引之间的未分配索引,如上所述),以及一个可选对象用作调用回调的范围

this的 indojo.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/

于 2012-09-19T08:06:44.397 回答