0
Answered

Переменная в листенере

S1210 7 years ago in General updated by Andrey S 7 years ago 5

Добрый день. У меня вопрос такой, можно ли использовать переменную в листенере? Например так:


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;
});


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;
   
   });
});

Вариант рабочий, но на сколько я понимаю, в таком случае я запираю данные записанные в переменную 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; 

};


Так как же мне адаптировать ваш вариант, чтобы вторая часть кода тоже работала?


+1

В качестве четвертого параметра можно передавать контекст работы (то, что является объетом this)

в качестве объекта можно передавать переменную и к ней же обращаться (подобно function.call(glbl, arg1, arg2.. в языке JS), чтобы не плодить лишние.

IR.AddListener(IR.EVENT_START,0,function()
{
   var glbl;
   IR.AddListener(IR.EVENT_ITEM_PRESS, IR.GetPopup("Страница 1").GetItem("Item 1"), function ()
   {
      this.Name2 = IR.GetPopup("Страница 1");
      IR.AddListener(IR.EVENT_ITEM_PRESS, this.Name2.GetItem("Item 2"), function()
      {
         this.Name1 = "Свет";
         IR.Log(this.Name2);
         IR.GetPopup("Страница 1").GetItem("Item 3").Text = this.Name1;
      },this);
   },glbl);
});

либо создавать новый объект

IR.AddListener(IR.EVENT_START,0,function()
{
   var glbl; 
   IR.AddListener(IR.EVENT_ITEM_PRESS, IR.GetPopup("Страница 1").GetItem("Item 1"), function ()
   {
      this.Name2 = IR.GetPopup("Страница 1");
      var obj2=this;
      IR.AddListener(IR.EVENT_ITEM_PRESS, this.Name2.GetItem("Item 2"), function()
      {
         this.Name1 = "Свет";
         IR.Log(this.Name2);
         IR.GetPopup("Страница 1").GetItem("Item 3").Text = this.Name1;
      },obj2);
   },glbl);
});

обычно в качестве контекста передают сам объект, на который создается событие.

var obj=Name2.GetItem("Item 2");
IR.AddListener(IR.EVENT_ITEM_PRESS, obj, function(){IR.Log(this.Name);},obj);


Мне кажется, что это не самое изящное решение задачи, ведь придется еще добавлять RemoveListener


Подумайте над другими вариантами

http://support.iridiummobile.net/topics/11768-listener-dlya-neskolkih-elementov/#comment-71653


Посмотрите еще свойство Parent http://dev.iridiummobile.net/GUI_API#Item