0

ループでボタンを作成していますが、ボタンのタグにforEach機能を持たせようとすると、機能ではないと表示されます。コードは次のとおりです。onClickthis.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 を取得する方法がわかりませんdojo.connect(button.id, 'onClick', this, foo())。残念ながら、このステートメントでも同じエラーが発生します。これは些細なスコーピングの問題かもしれませんが、私は道場にとても慣れていないので、助けていただければ幸いです!

編集: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実際には 3 つのパラメーター ( source )を受け入れます。

dojo.forEach メソッドは 3 つの引数を受け入れます: 反復する配列、配列の各項目 (上記のように、割り当てられた項目間の未割り当てのインデックスを含む) に対して呼び出す関数 (またはコールバック)、およびオプションのオブジェクトです。 callback を呼び出すスコープとして使用します

コールバック関数へthisのポイントで、 3 番目のパラメーターとして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/

于 2012-09-19T08:06:44.397 に答える