2015-10-01 69 views
1

我在我的Tiatnium應用程序中使用採集器。採樣器更改事件在Titanium中第一次未觸發

Picker數據從json響應中加載。我首先將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

很難得到這個小提琴我想,因爲它是鈦 – Suraj

+0

你能檢查這個簡單的例子是否工作嗎? var row1 = Ti.UI.createPickerRow({\t title:「row1, }); var row2 = Ti.UI.如果您的問題存在於您發佈的代碼或其他內容中, createPickerRow({\t title:「row2, }); var pickerData = [row1,row2]; $ .picker.add(pickerData); $ .picker.addEventListener( '變',函數(E){ \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

這是很長的時間來回答這個問題,但我已經找到了一種使用Alloy 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文件中創建整個選擇器。