1

私は新しい Palm Pre WebOS に取り組んでいます。Palm Pre 用のアプリは、Prototype Javascript Framework の上に開発された MojoSDK で開発されています。

同じアシスタントの一部でもあるイベント ハンドラーのアシスタント レベルで定義された変数にアクセスしようとしています。イベント ハンドラーでアシスタント レベルの変数にアクセスすると、未定義として取得されます。ただし、変数は setup 関数でアクセスできます。

参考までに、以下のコードをご覧ください。

コード:

function MyTestAssistant(passedValue)
{
    this.passedValue = passedValue;
}

MyTestAssistant.prototype.setup = function()
{
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor
}

MyTestAssistant.prototype.testListTapHandler = function(event)
{
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Logs undefined
}

ここではこれを次のように呼びます。

Mojo.Event.listen(this.myTestList, Mojo.Event.listTap, this.testListTapHandler); 

他の誰かがこの問題を抱えていますか、それとも私はここで何か間違っていますか? ハンドラーで変数にアクセスすることは可能ですか?それを達成するための回避策を考えることができますか?

4

2 に答える 2

3

私は mojo-sdk に詳しくありませんが、これは、イベント ハンドラーをセットアップするときに "this" 参照が混同されているように思えます。ほとんどの場合、testListTapHandler が呼び出されると、これはイベントを発生させているオブジェクトを参照します。

Prototype には、この混乱を解消するのに役立つ非常に便利なbind()メソッドがあります。

私はあなたがこのようなものを持っていたと思います

elem.observe('eventname', myTestAssistant.testListTapHandler);

問題は、イベントが発生したときに、testListTapHandler 内で、これが elem を参照することです。これを修正するには、イベント ハンドラーを目的のオブジェクトにバインドします。

elem.observe('eventname', myTestAssistant.testListTapHandler.bind(myTestAssistant));
于 2009-08-06T06:32:33.737 に答える
0

私は問題の解決策を見つけました。別のフォーラムも私を 助けてくれました。

Paulが指摘したように、中心的な問題はバインディングとスコープです。

実装を機能させるために、実装を次のように更新しました。

function MyTestAssistant(passedValue)
{
    this.passedValue = passedValue;
}

MyTestAssistant.prototype.setup = function()
{
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor

    // Was Using the following code before and this.passedValue wasn't accessible in 
    // testListTapHandler

    // Mojo.Event.listen(this.testList, Mojo.Event.listTap, this.testListTapHandler);

    // Used the following code now and this.passedValue is accessible in 
    // testListTapHandler

    this.testListTapHandler = this.testListTapHandler.bindAsEventListener(this);
    Mojo.Event.listen(this.testList, Mojo.Event.listTap, this.testListTapHandler);  
}

MyTestAssistant.prototype.testListTapHandler = function(event)
{
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor
}

ポールの助けに感謝します。

よろしく、

ムハンマド・ハシーブ・カーン

于 2009-08-07T06:11:13.800 に答える