2011-02-23 4 views
5

JavaScript関数をdojoクラスに変換しようとしています。私は、私のJSメソッドの一つにsetTimeOut("functionName",2000)を持っています。 dojo.declareメソッドを使用してクラスのメソッドからこれを呼び出すにはどうすればよいですか?たとえば、私のカスタムクラスは次のとおりです。DojoでJavaScriptのsetTimeOutを呼び出すクラス

dojo.declare("Person",null,{ 
        constructor:function(age,country,name,state){ 
         this.age=age; 
         this.country=country; 
         this.name=name; 
         this.state=state; 
        }, 
        moveToNewState:function(newState){ 
         this.state=newState; 
//I need to call "isStateChanged" method after 2000 ms. How do I do this? 
         setTimeOut("isStateChanged",2000); 
        },     
        isStateChanged:function(){ 
         alert('state is updated'); 
        } 
       }); 
var person=new Person(12,"US","Test","TestState"); 
person.moveToNewState("NewState"); 

私は2000msの後moveToNewState方法からisStateChangedメソッドを呼び出すことができる方法を教えてください。あなたが探しているもの

+0

へコンパイルしなければならない文字列ではなく、関数参照を渡してください。 –

答えて

9

setTimeoutが呼び出すこと関数へ結合this値の方法です:

moveToNewState:function(newState){ 
    // Remember `this` in a variable within this function call 
    var context = this; 

    // Misc logic 
    this.state = newState; 

    // Set up the callback 
    setTimeout(function() { 
     // Call it 
     context.isStateChanged(); 
    }, 2000); 
},  

上記のコンテキストをバインドする閉鎖を使用している(参照: Closures are not complicated)、これはこれを行う通常の方法です。 Dojoは、これらの「バウンド」コールバック(PrototypeおよびjQuery do)を生成するための組み込み関数を提供することがあります。 (編集:それはありません、peller下の彼のコメントに親切にdojo.hitchを指摘した。)ここで、この一般的な概念について

より:You must remember this

+0

お返事ありがとうございました。出来た。コンテキストと呼ばれる新しい変数を作成し、それに現在のオブジェクトを割り当てるのはなぜですか?私は "this"が "Person"オブジェクトを参照すると思っていて、 "isStateChanged"というメソッドを持っています – Steven

+0

@Steven:* "なぜコンテキストと呼ばれる新しい変数を作成して、それに現在のオブジェクトを割り当てるのですか? '(JavaScriptで)は、*関数が定義されている場所ではなく、*関数がどのように呼び出されるか*によって完全に定義されます。 'setTimeout'はグローバルコンテキストで関数を呼び出します。これはブラウザ上で' this'が 'window'になることを意味します。これは明らかにあなたが望むことではありません。上記のほかにも、以下のような* [あなたは 'これを覚えておく必要があります](http://blog.niftysnippets.org/2008/04/you-must-remember-this.html)*のリンクをご覧ください:* [Mythical methods ](http://blog.niftysnippets.org/2008/03/mythical-methods.html)* –

+0

ありがとうございました。 – Steven

2

これは道場とは何の関係もありません、これは純粋なJavaScriptのです。あなたが探しているのは:

var $this = this; 
setTimeout(function() { $this.isStateChanged() }, 2000); 

チェックアウトthe docs on setTimeoutです。

ああ、関数名の周りに引用符を使用しないでください(おそらくevalが得られ、エラーが発生する)。

+0

お返事ありがとうございました。出来た。なぜ$ thisという新しい変数を作成し、それに現在のオブジェクトを割り当てるのですか?私は "this"が "Person"オブジェクトを参照し、メソッド "isStateChanged"を持っていると思った。 – Steven

+0

'this'は' Person'インスタンスを参照しますが、 'moveToNewState'クロージャでのみです。タイムアウトが発生すると、そのコンテキスト( 'this'の魔法の変数)は' Person'インスタンスではなく 'window'になります。このため、インスタンスを別名の変数に格納する必要があります。 ** T.J。 Crowder **はこの問題についての良いリンクを掲載しました。 – Felix

+0

Felixさん、ありがとうございました – Steven

2

メソッドを直接呼び出す方法とは異なり、正しい関数参照を渡すことができるsetTimeout(this.isStateChanged, 2000)を呼び出すことができます。式this.isStateChangedが直ちに評価されます。呼び出しを行うには、余分な関数にラップするか、ローカル変数を宣言する必要はありません。

this変数を呼び出された関数にバインドするには、dojo.hitchを使用します。ローカル変数空間を汚染することなく、独自のクロージャを作成し、他の参照を介して漏洩する可能性があります。

1

あなたは道場/ _base/LANGを使用して、以下のコードのようにそのヒッチメソッドを使用することができます:それは `setTimeout`は、ない` setTimeOut`、だとそれは(常に、またはほとんど常に)が最適です

moveToNewState:function(newState){ 
    // Misc logic 
    this.state = newState; 

    // Set up the callback 
    setTimeout(lang.hitch(this, function() { 
    // Call with `this` 
    this.isStateChanged(); 
    }), 2000); 
},