Прототип доступа к переменным - PullRequest
1 голос
/ 06 августа 2009

Я работаю над новой 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 ]

3 голосов
/ 06 августа 2009

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

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

Полагаю, у вас было что-то подобное

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

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

elem.observe('eventname', myTestAssistant.testListTapHandler.bind(myTestAssistant));
0 голосов
/ 07 августа 2009

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

Основная проблема, на которую указал Павел, касается «Связывания и охвата».

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

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
}

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

С уважением,

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

...