Приспособленный VirtualRepeater, содержащий IntegerPicker

В моем приложении Enyo у меня есть VirtualRepeater, который создает Control, содержащие различные текстовые дисплеи, и IntegerPicker.

У меня две проблемы с этим репитером:

1) Если создано три строки, щелчок по IntegerPicker в строках 1 и 2 вызывает раскрывающийся пользовательский интерфейс выбора поверх IntegerPicker в строке 0.

2) Я инициализирую каждое IntegerPicker максимальным значением, используя setMax(). Однако, если создаются три строки, IntegerPickers в строках 0 и 1 будет иметь то же максимальное значение, что и в строке 2.

Похоже, что только один IntegerPicker создается и используется в первой строке.

Я попытался заменить свой VirtualRepeater на Repeater и изменил функцию создания строки повторителя, чтобы возвращать новый экземпляр элемента, содержащего IntegerPicker, вместо возврата true. Однако это вызывает ошибку:

предупреждение: enyo.Component.addComponent(): повторяющееся имя компонента "itemName" нарушает правило уникального имени под владельцем, заменяя существующий компонент в хэше и продолжая работу, но это состояние ошибки и должно быть исправлено.

Кажется, что Repeaters нуждаются в том, чтобы их делегаты были созданы встроенными, что кажется довольно неэлегантным.

Этот пример кода иллюстрирует проблему:

enyo.kind({
   name:"Test",
   kind:enyo.Control,
   components: [
      {
         kind: "VirtualRepeater",
         onSetupRow: "setupRow",
         components: [{
                name: "theIP", kind: "IntegerPicker", min:0
         }]
      }
   ],

   setupRow: function(inSender, inIndex) {
      if (inIndex < 3) {
         this.$.theIP.setMax(inIndex);
         return true;
      }
      return false;
   }
});

Как я могу создать произвольное количество IntegerPickers в своем приложении? Любая помощь приветствуется!


person funkybro    schedule 04.07.2011    source источник


Ответы (1)


То, что вы делаете с IP в своей функции setupRow, — это доступ к конкретному самому IntegerPicker, который является дочерним компонентом виртуального повторителя. Чтобы установить максимальное значение данного IntegerPicker, соответствующего строке, дайте вашему VirtualRepeater атрибут имени, например «PickerList»:

 kind: "VirtualRepeater",
 onSetupRow: "setupRow",
 name: "PickerList",
 components:[//this should be empty to begin with]

Затем вы можете получить доступ к каждой строке повторителя следующим образом:

setupRow: function(inSender, pickerMax) {

   var newPicker = new IntegerPicker(pickerMax);
   this.$.PickerList.push(newPicker);

Чтобы получить конкретную строку в VirtualRepeater, вам нужно сделать это следующим образом:

this.$.PickerList[1];

Вот расширенный учебник Enyo, в котором используется VirtualRepeater: https://developer.palm.com/content/resources/develop/extended_enyo_tutorial.html

person RedMage    schedule 04.06.2012