1

我正在开发新的 Palm Pre WebOS,Palm Pre 的应用程序是在 MojoSDK 中开发的,MojoSDK 是在 Prototype Javascript 框架之上开发的。

我正在尝试访问事件处理程序中在助手级别定义的变量,这些变量也是同一助手的一部分。当我在事件处理程序中访问助理级别变量时,我将其视为未定义。但是,可以在 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 时, this 引用了触发事件的对象。

Prototype 有一个非常方便的bind()方法来帮助消除这种混淆。

我猜你有这样的事情

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

麻烦的是,当事件被触发时,在 testListTapHandler 中,this 将引用 elem。为了纠正这个问题,我们将事件处理程序与所需的对象绑定:

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

我找到了解决问题的方法。另一个论坛 也帮助了我。

正如保罗所指出的,核心问题是绑定和范围。

我将我的实现更新为以下内容以使其工作:

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 回答