Titanium App保留多次搜索的子视图

时间:2013-08-06 01:02:37

标签: javascript json titanium-mobile

我正在为iOS构建Titanium移动应用程序。我将指三个不同的屏幕;主屏幕具有桌面视图,“主”屏幕具有“搜索字段”和“详细”屏幕。

当我从主屏幕导航到主屏幕时,向用户显示搜索字段和消息。当用户在搜索字段中键入单词时,我删除消息并绘制表格,然后在远程服务器上调用PHP文件以在数据库中搜索该单词并将结果作为JSON返回并显示在该表中。当用户选择结果之一时,显示详细屏幕。所有这些都按预期工作。

当用户返回母版页并执行其他查询时,会出现此问题。我有一个清除表数据的按钮,该按钮有效地清除了表格。但是,当显示第二次搜索的结果并选择一个以查看详细信息页面时,应用程序似乎显示详细信息屏幕,但该屏幕继续滑出,第二个详细信息屏幕会滑动并显示数据。

如果用户返回母版页并执行第三次查询,则同样的问题会成倍增加。表格再次填充结果,但当用户选择一个时,两个详细信息屏幕会在用户显示数据之前滑过。

如果以与上述相同的方式执行另一个查询,则在向用户呈现数据之前三个细节屏幕滑过。

此模式继续倍增细节屏幕,直到用户返回主屏幕。然后一切似乎都重置了。以下是代码片段:

var win = Titanium.UI.currentWindow; 
var appsponsor = Ti.UI.createButton({});
win.add(appsponsor);
appsponsor.addEventListener('click',function(e){});

var customSearchBar = Ti.UI.createView({});

var customSearchField = Ti.UI.createTextField({});
customSearchBar.add(customSearchField);
win.add(customSearchBar);

var nolist= Ti.UI.createLabel({});
win.add(nolist);

var businessowner = Ti.UI.createLabel({});
win.add(businessowner);

var view = Ti.UI.createView({});
var table = Ti.UI.createTableView({});
view.add(table);

var message = Ti.UI.createLabel({});    

    var clear = Ti.UI.createButton({
        title: "Clear",
        style:Titanium.UI.iPhone.SystemButtonStyle.BORDERED
        });
        clear.addEventListener("click", function() {
            message.hide();
            table.setData([]);
            tableData = [];
        }); 
Ti.UI.currentWindow.setRightNavButton(clear);

var tableData = [];

function checkInternetConnection(){
return Ti.Network.online ? true : false;
}
customSearchField.addEventListener("return", function(e) {

if(checkInternetConnection()){
    nolist.hide();
    businessowner.hide();
    win.add(view);
    var url = "http://mydomain.com/dir/file.php?title="+e.value;
    var xhr = Ti.Network.createHTTPClient({
        onload: function() {
            Ti.API.debug(this.responseText);
            var json = JSON.parse(this.responseText);
                if (json.cms_list.length< 1){ 
                    win.add(message);
                    }
                for (i = 0; i < json.cms_list.length; i++) {
                    client = json.cms_list[i];
                    row = Ti.UI.createTableViewRow({});
                        var clientlist = Ti.UI.createLabel({});
                    row.add(clientlist);
                    tableData.push(row);
                    }
                    table.addEventListener('click',function(e){
                        var row = e.row;
                        var clientlist = row.children[0];
                            var win = Ti.UI.createWindow({
                                url: 'clientdetail.js', 
                                title: clientlist.text  
                                }); 
                        var clientlist = clientlist.text;
                        win.clientlist = clientlist;
                        Ti.UI.currentTab.open(win,{animated:true});
                        }); 
                    table.setData(tableData);
        },

        onerror: function(e) {
            Ti.API.debug("STATUS: " + this.status);
            Ti.API.debug("TEXT:   " + this.responseText);
            Ti.API.debug("ERROR:  " + e.error);
            alert('There was an error retrieving the remote data. Try again.');
            },
        timeout:5000

        });

    xhr.open("GET", url);
    xhr.send();
    }
else{
    alert('Your internet connection is not available');
    }
});

此代码中的错误在哪里导致它产生我上面解释的问题?

1 个答案:

答案 0 :(得分:1)

我认为这是因为您的点击事件监听器。

每当您返回代码并重新填充时,您都会添加另一个侦听器。所以第二次运行该函数两次,然后是3次等。

您应该在点击时删除侦听器,或者从onLoad函数中删除它,以便每次都不会重新添加它

马丁