2015-10-01 8 views
1

Я использую сборщик в своем приложении Tiatnium.событие смены сборщика не срабатывает в первый раз в титане

Данные подборщика загружаются из json response.I сначала хранятся данные API в временном массиве, а затем добавляются данные в сборщик.

Проблема заключается в том, когда я нажимаю элементы выбора, когда событие изменения не срабатывает. После того, как первый щелчок будет выполнен, тогда, если я нажму на любой элемент, он будет работать так, как ожидалось.

Вот небольшой фрагмент кода из него

for (var i = sorted.length - 1; i >= 0; i--) { 
      pickerData[i] = Ti.UI.createPickerRow({ 
       title : sorted[i], 

     }); 
      Ti.API.info('From sorted ' + i + sorted[i]); 
     } 
$.picker.add(pickerData); 
$.picker.addEventListener('change', function(e) { 
      countRow = 0; 
      data.length = 0; 
      showfilterData(e.row.title, jsonResponse); 
     }); 

Так что это проблема.

Может ли кто-нибудь объяснить?

+0

Можете ли вы как-то обеспечить скрипку для тестирования? –

+2

довольно сложно получить это на скрипке, я думаю, так как это Titanium – Suraj

+0

Не могли бы вы проверить, работает ли этот простой пример? Просто чтобы понять, есть ли проблема в коде, который вы опубликовали или в чем-то еще ... 'var row1 = Ti.UI.createPickerRow ({ \t title:" row1, }); var row2 = Ti.UI. createPickerRow ({ \t название: "row2, }); var pickerData = [row1, row2]; $ .picker.add (pickerData); $ .picker.addEventListener ('изменение', функция (е) { \t console.log ('нажал на строку' + e.row.title); }); ' –

ответ

0

Следующий пример работает нормально:

index.xml

<Alloy> 
    <Window id="mainWindow"> 
    </Window> 
</Alloy> 

index.js

var picker = Titanium.UI.createPicker(); 
var data = []; 
data[0]=Ti.UI.createPickerRow({title:'Bananas'}); 
data[1]=Ti.UI.createPickerRow({title:'Strawberries'}); 
data[2]=Ti.UI.createPickerRow({title:'Mangos'}); 
data[3]=Ti.UI.createPickerRow({title:'Grapes'}); 
picker.add(data); 
picker.addEventListener('change', function(e) { 
    console.log(e.row.title); 
}); 
$.mainWindow.add(picker); 
$.mainWindow.open(); 

Каждый раз, когда (и первый), что я щелкаю на в строке сборщика я получаю правильный журнал на консоли. Протестировано на титане 4.1.0, iOS 8.4

Сборщик отлично работает. Я думаю, что в вашем коде есть что-то еще неправильное (что-то, что вы нам не показывали).

Позвольте мне знать, если этот пример не работает для вас

+0

эй извините за поздний ответ ... Я пробовал этот код в отдельном файле и обнаружил какую-то странную проблему. Если я пишу это в js-файле, он работает как ожидалось, и если я сохраняю сборщик в XML-файле, повторяется одна и та же проблема. вы пытаетесь сделать то же самое? ... держите сборщик в файле xml и данных в js-файле и просто посмотрите, придет ли это или нет? – Bunny

0

Это первый раз, когда я даю ответ на свой вопрос. Для всех тех, у кого проблемы с получением первого щелчка сборщика, это может вам помочь.

  • Если вы пишете сборщик в файле XML, то вы можете столкнуться этим вопросом я тоже, потому что мы добавляем данные из кода и выбор уже отображаются, когда окно открывается, так что добавь сборщик в файле JS ... это может не быть техническим описанием, но я пробовал это, поэтому я предполагаю, что это работает для всех. Я отправляю оба способа, в которых он не работает (означает проблему с первым щелчком) и способ, которым он работает должным образом.

Вот код, в котором вы можете столкнуться с проблемой.

<Alloy> 
<Window id="winpast" class="container" title="Past issues" onOpen="openpastIssues"> 
    <View id="view2" width="Ti.UI.FILL" height="Ti.UI.FILL" backgroundColor="#A9F5A9" > 
     <View id="viewcheck1" > 
      <Label id="title" width="Ti.UI.SIZE" text="Past Issues" height="Ti.UI.SIZE" textAlign="Ti.UI.TEXT_ALIGNMENT_CENTER"></Label> 
      <ImageView id="menuImg" image="/images/menu.png" onClick="showsideBar" left="5"></ImageView> 
      <Picker id="picker" selectionIndicator="true" height="Ti.UI.SIZE" width="Ti.UI.SIZE" right="10"> 
      </Picker> 
     </View> 
    </View> 
</Window> 

JS файл

for (var i = sorted.length - 1; i >= 0; i--) { 
      pickerData[i] = Ti.UI.createPickerRow({ 
       title : sorted[i], 

     }); 
$.picker.add(pickerData);//picker is added in xml file and data is added now 
picker.addEventListener('change', function(e) { 
      alert(e.row.title); 

     }); 
$.winpast.open(); 

Вышеуказанные фрагменты могут быть проблемы с захватывающим первым щелчком.

Теперь вот правильный путь, который я осуществил, чтобы удалить эту проблему с советом @Riccardo щечно

Я просто дал испытание, используя его предложение и выяснил это.

Вот правильный код.

<Alloy> 
<Window id="winpast" class="container" title="Past issues" onOpen="openpastIssues"> 
    <View id="view2" width="Ti.UI.FILL" height="Ti.UI.FILL" backgroundColor="#A9F5A9" > 
     <View id="viewcheck1" > 
      <Label id="title" width="Ti.UI.SIZE" text="Past Issues" height="Ti.UI.SIZE" textAlign="Ti.UI.TEXT_ALIGNMENT_CENTER"></Label> 
      <ImageView id="menuImg" image="/images/menu.png" onClick="showsideBar" left="5"></ImageView> 
     </View> 
    </View> 
</Window> 

JS файл

var picker = Ti.UI.createPicker({ 
      right:10 
     }); 
for (var i = sorted.length - 1; i >= 0; i--) { 
      pickerData[i] = Ti.UI.createPickerRow({ 
       title : sorted[i], 

     }); 
      Ti.API.info('From sorted ' + i + sorted[i]); 
     } 
picker.add(pickerData);//we add data here and picker is not added yet 
$.viewcheck1.add(picker);//after adding whole data we are adding picker in the view so it resolves the first click issue. 
$.winpast.open(); 

Второй способ отлично работает для меня, и нет первого вопроса щелчка picker.If любой вещи в моем ответе не должным образом упомянута то, пожалуйста, исправьте меня.

Надеюсь, это поможет.

0

Это долгое время, чтобы ответить на этот вопрос, но я нашел новый способ выполнить эту задачу, используя также сплайн XML.

  1. Создание сборщика в файле js хорошо работает в событии изменения.
  2. Если вы создали сборщик в файле XML, и вы добавляете строки сборщика в js-файл, вам необходимо дважды вызвать метод ниже. Это немного странно, но он работает аккуратно.

Index.xml

<Alloy> 
<Window> 
    <Picker id="PICKER" width='70%' height="Ti.UI.SIZE" onChange="changeValue"></Picker> 
<Window> 
</Alloy> 

index.js

(function setPickerValues() { 
    $.PICKER.add(rows) // rows is an array of Ti.UI.PickerRows 

    // call these two lines to make the change event work 
    $.PICKER.setSelectedRow(0, 1); // this will set the picker row to the row at index 1 
    $.PICKER.setSelectedRow(0, 0); // now it is necessary to set row at index 0 again to make it work. 
})(); 

function changeValue(e) { 
    Ti.API.info('Current Row = ' + e.rowIndex); 
} 

Я знаю, что этот способ немного странно, но да, он работает довольно хорошо, и занимает меньше строк кода, чем создание цельного сборщика в js-файле.