0
Answered
Переменная в листенере
Добрый день. У меня вопрос такой, можно ли использовать переменную в листенере? Например так:
var Name1;
var Name2;
IR.AddListener(IR.EVENT_ITEM_PRESS, IR.GetPopup("Страница 1").GetItem("Item 1"), function ( )
{
Name2 = IR.GetPopup("Страница 1");
});
IR.AddListener(IR.EVENT_ITEM_PRESS, Name2.GetItem("Item 2"), function ( )
{
Name1 = "Свет";
IR.GetPopup("Страница 1").GetItem("Item 3").Text = Name1;
});
Customer support service by UserEcho
Здравствуйте!
Да, вы можете исопльзовать переменную в слушателе, если в нее записана ссылка на элемнт. Но ваш скрипт выдаст ошибку при первом запуске, т.к. второй слушатель будет пытаться получить ссылку на объект, но он еще на записан в переменную. Поэтому вам необходимо немного переделать скрпит. Например вот так:
Вариант рабочий, но на сколько я понимаю, в таком случае я запираю данные записанные в переменную Name1 в пределах этого кода и не смогу использовать их дальше по скрипту. То есть у меня дальше есть код:
IR.AddListener(IR.EVENT_ITEM_RELEASE,IR.GetPopup("Страница 1").GetItem("Item 4"), SettingsOpen);
function SettingsOpen()
{
if (IR.GetPopup(Name1).GetItem("Item 1").Value == 1)
{
IR.TogglePopup("Попап 1");
} else
{
IR.GetPopup(Name1).GetItem("Item 1").Value = 0;
}
};
Вы их и в первом варианте запирали внутри первого слушателя и поэтому при запуске во время инициализации слушателей, второй выдавал ошибку, т.к. в переменной не было значения.
Для того, чтобы работал присланный вами кусок оставшегося кода, необходимо чтобы вначале сработал первый кусок и записал значение в переменную, а затем уже можно будет отрабатывать второй кусок. Саму переменную вы не записарете, т.к. она объявлена у вас как глобальная в самом начале скрипта, таким образом она будет доступна из любой части скрипта.
При использовании этого кода без использования переменной Name2 :
var Name1;
IR.AddListener(IR.EVENT_ITEM_PRESS, IR.GetPopup("Страница 1").GetItem("Item 2"), function ( )
{
Name1 = "Свет";
IR.GetPopup("Страница 1").GetItem("Item 3").Text = Name1;
});
вторая часть кода работает:
IR.AddListener(IR.EVENT_ITEM_RELEASE,IR.GetPopup("Страница 1").GetItem("Item 4"), SettingsOpen);
function SettingsOpen()
{
if (IR.GetPopup(Name1).GetItem("Item 1").Value == 1)
{
IR.TogglePopup("Попап 1");
} else
{
IR.GetPopup(Name1).GetItem("Item 1").Value = 0;
}
};
Так как же мне адаптировать ваш вариант, чтобы вторая часть кода тоже работала?
В качестве четвертого параметра можно передавать контекст работы (то, что является объетом this)
в качестве объекта можно передавать переменную и к ней же обращаться (подобно function.call(glbl, arg1, arg2.. в языке JS), чтобы не плодить лишние.
либо создавать новый объект
обычно в качестве контекста передают сам объект, на который создается событие.
Мне кажется, что это не самое изящное решение задачи, ведь придется еще добавлять RemoveListener
Подумайте над другими вариантами
http://support.iridiummobile.net/topics/11768-listener-dlya-neskolkih-elementov/#comment-71653
Посмотрите еще свойство Parent http://dev.iridiummobile.net/GUI_API#Item