2011-06-24 12 views
0
dojo.declare("profile.BasicInfo", [dijit._Widget, dijit._Templated], { 
    somefunc: function() { 
    dojo.xhrPost({ 
     url: ajaxURL, 
     content: adata, 
     load: function(data) { 
      alert(this);//this refers to the object sent to xhrPost 
     } 
    }); 
    }, 
    somevar: 17 
}); 

Iはthisが機能xhrPostにパラメータとして送信対象IMを指す使用場所である必要があります。これは正しいです。エラーはありません。しかし、私はdojo.declareの3番目のパラメーターであるオブジェクトにアクセスしたいと思います。これへの参照が道場ウィジェット

またはsomevarにアクセスします。確かにthis.somevarは効きません。

私が思いついた解決策の1つは、thisの複製参照を使用し、xhrPost内で使用することでした。これは使えますか?または私は間違った方法でオブジェクトを使用しています。これは、dojoローダがファイルを解析するときに問題になるでしょうか?

somefunc: function() { 
    var temp = this; 
    dojo.xhrPost({ 
     url: ajaxURL, 
     content: adata, 
     load: function(data) { 
      alert(temp);//will temp refer to what i want it to? 
     } 
    }); 
}, 

もっと良い解決策はありますか?

答えて

1

this questionへの回答で説明し、それはダグラス・クロックフォードconventionだから、私が使用することを好む:

var that = this; 
2

あなたのソリューションの例は、まさにそのやり方です。多くの人が、変数に命名するという規約を使用して、「自己」に束縛されています。理由から

var self = this; 
+2

'この'

きれいになりますしてい。しかし、私は自分自身で 'var self = this'の方が好きです。コードが少なく、より明確です。 –

+1

ああ、私はそのことを忘れていました。私はそれが限られた道場経験を持つ人々を混乱させると思うので、個人的に、私はヒッチを使用しません。 – limscoder

3

dojo.hitchは

インライン無名関数を立派に見えます痛みです...宣言のような入れ子の使用を避けてください。(..、{{func1:function {} {xhr.send {{load:function(){}}}}});

が、あなたのケースでは

一時は、参考ます。また `this`の範囲を変更するための` `dojo.hitchを()を使用することができます

on: function() { 
    xhr.send({ 
    load: lang.hitch(this, then) 
    }); 
}, 
then: function(data, io) { 
    alert(typeof this.on == "function" + "==true"); 
} 
+0

「this' _always_が 'this'を意味するとき、それはより良く見えるだけでなく、エラーを起こしにくくなります。 – danorton