Прототип доступа к переменным

Я работаю над новой Palm Pre WebOS, приложения для Palm Pre разрабатываются в MojoSDK, который разрабатывается поверх Prototype Javascript Framework.

Я пытаюсь получить доступ к переменным, определенным на уровне помощника в обработчиках событий, которые также являются частью одного и того же помощника. Когда я получаю доступ к переменным уровня помощника в обработчике событий, я получаю его как неопределенное. Тем не менее, переменные доступны в функции настройки.

Для справки взгляните на код ниже:

Код:

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
}

У кого-то еще есть эта проблема, или я делаю что-то здесь не так. Можно ли получить доступ к переменным в обработчике, или мы думаем об обходных путях для достижения этого.

Ждем ответа в ближайшее время.

Спасибо и С уважением,

Мухаммед Хасиб Хан

2 ответа

Я не знаком с mojo-sdk, но это звучит так, как будто вы только что перепутали ссылку "this" при настройке обработчика события. По всей вероятности, когда вызывается testListTapHandler, это ссылается на объект, который запускает событие.

Prototype имеет очень удобный метод bind(), чтобы помочь устранить эту путаницу.

Я думаю, у вас было что-то вроде этого

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

Проблема в том, что при возникновении события внутри testListTapHandler это будет относиться к элементу. Чтобы исправить это, мы связываем обработчик событий с желаемым объектом:

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

Я нашел решение проблемы. Еще один форум помог мне.

Основная проблема, на которую указал Павел, связана с Binding and Scope.

Я обновил свою реализацию до следующего:

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
}

Спасибо за вашу помощь, Пол.

С Уважением,

Мухаммед Хасиб Хан

Другие вопросы по тегам