拾取器更改事件未在Titanium中首次触发

时间:2015-10-01 08:48:41

标签: javascript event-handling titanium-mobile picker

我在Tiatnium应用程序中使用选择器。

Picker数据从json响应加载。我首先在临时数组中存储API数据,然后将数据添加到选择器。

问题是,当我第一次点击选择元素时,更改事件不会被触发。 完成第一次点击后,如果我点击它按预期工作的任何元素。

以下是它的小代码片段

letters=['A', 'I', 'R']
[letters[start:end+1] 
 for start in xrange(len(letters)) 
 for end in xrange(start, len(letters))]

[['A'], ['A', 'I'], ['A', 'I', 'R'], ['I'], ['I', 'R'], ['R']]

那么问题是什么。

任何人都可以解释一下吗?

3 个答案:

答案 0 :(得分:0)

以下示例正常工作:

<强> INDEX.XML

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

<强> index.js

RequestDispatcher rd = request.getRequestDispatcher("load_plan");
rd.forward(request, response);
//or rd.include(request, response);

每次(也是第一次)我点击选取器的一行时,我都会在控制台上获得正确的日志。在Titanium 4.1.0,iOS 8.4上测试

选择器工作正常。我猜您的代码中还有其他问题(您没有向我们展示过这些内容)。

如果此示例不适合您,请告诉我

答案 1 :(得分: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 file

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 Bucco的建议实现删除此问题的正确方法

我只是根据他的建议进行了试验并发现了这一点。

这是正确的代码。

<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 file

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

第二种方式适用于我,并且没有选择器的第一次点击问题。如果我的答案中的任何内容都没有被正确提及那么请纠正我。

希望它有所帮助。

答案 2 :(得分:0)

这是回答这个问题的时间很长,但我找到了一种使用Alloy XML完成此任务的新方法。

  1. 在js文件中创建选择器在更改事件中运行良好。
  2. 如果您在XML文件中创建了选择器,并且要在js文件中添加选择器行,则需要调用以下方法两次。这有点奇怪,但它整齐地运作。
  3. <强> 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文件中创建整个选择器所需的代码行少。