Flyweight VirtualRepeater, содержащий IntegerPicker - PullRequest
2 голосов
/ 04 июля 2011

В моем приложении 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" нарушает правило уникального имени под владельцем, заменяя существующий компонент в хэше и продолжая, но это условие ошибки и должно быть исправлено.

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

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

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

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

1 Ответ

0 голосов
/ 05 июня 2012

То, что вы делаете с 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

...