0

dojo/_base/declare で作成された Dojo のクラスのようなオブジェクトを使用する際に、いくつかの概念上の問題があります。

次のモジュールを作成しました。

define(["dojo/_base/declare", ....], function(declare,....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

問題は、関数newItemが機能していないことです。これは、ボタン クリックから呼び出されたときにthis、'my.widget' インスタンスではなく、Button ウィジェットを指しているためです。

よくわかりません。「my.widget」インスタンスを参照するにはどうすればよいですか? 私が読んだ Dojo クラスでは、現在のインスタンスは で利用可能ですthis

4

2 に答える 2

1

newItemその後、正しいスコープで呼び出したい場合はdojo/_base/langhitch()関数を使用できます。

define(["dojo/_base/declare", "dojo/_base/lang", ....], function(declare, lang, ....){
    return declare('my.widget', null ,function(..){
     startup: function() {
       new Button({onClick: lang.hitch(this, "newItem"}, newButtonNode)
     },
     newItem: function() {
       this.openDialog({}, this.saveItemCallback)
     },
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
});

このhitch()関数は、this参照が正しいことを確認します。これは本当の魔法のように聞こえますが、スクリーンの背後にある種の反射を使用して機能を実行します。

実際に行うことは、Function.prototype.apply関数を使用して魔法を開始することです。この記事で読むことができるように、コンテキストとパラメーターを受け入れます。したがって、実際には、実行this時に参照が変更newItemされます。

于 2013-10-16T07:54:14.807 に答える
0

を使用dojo.hitchして、コンテキストを関数にアタッチできます。

define(["dojo/_base/declare", ....], function(declare,....){
    var myFunc = dojo.hitch(this, function() { 
       this.openDialog({}, this.saveItemCallback)
    });

    return declare('my.widget', null ,function(..){
     startup: function() {
       ....
       new Button({onClick: this.newItem}, newButtonNode)
     },
     newItem: myFunc,
     openDialog: function(item,callback){...},
     saveItemCallback: function(item){....}
    })
})

そうすることで、 に渡された無名関数内で、渡された最初の引数 (任意のオブジェクトである可能性があります) を参照することを効果的に述べていdojo.hitchますthis

于 2013-10-16T07:52:22.453 に答える