javascript - 返回了意外的事件监听器结果

标签 javascript ios database titanium

我正在使用 Titanium 构建 iOS 应用程序。我试图在 tableView 中显示一个按字母顺序排列的列表。选择特定行后,我想将行信息传递到新窗口。 The code I have displays the list alphabetically in groups with headers and I have an alphabetical scrollbar that when a letter is selected the list moves to that letter. However, when ANY row is selected, they all send the information for the last row in the database.我认为我需要在行中有一个带有文本属性的标题元素,然后我可以有一个 tableview.addEventListener 来获取该标题并将其传递,但​​它不起作用。这是我正在使用的代码,如果有人可以看看我哪里出错了,将不胜感激。

var db = (function() {
var api   = {};
    api.all_item_names = function() {
        var conn = Ti.Database.install('mydb.sqlite','clients');
        var results = [];
        var resultSet = conn.execute('select * from clients order by clientname asc');
        while ( resultSet.isValidRow()) {
            results.push({
            clientname:  resultSet.fieldByName('clientname'),
        });
        resultSet.next();
    }
    resultSet.close();
    return results;
};
return api;
}());

var tvrow;
var curheader   = 'A';
var list    = [];
var index   = [];
var data   = [];
var isAndroid   = (Titanium.Platform.name == 'android');

list = ( db.all_item_names() );

for ( var ipos=0; ipos<list.length;ipos++){
    if( list[ipos].clientname[0] != curheader){
        curheader = list[ipos].clientname[0];

        tvrow = Titanium.UI.createTableViewRow({
            height:    40,
            path:'clientdetail.js' ,
            client: list[ipos],
            header:    curheader 
            });
        index.push({title:curheader, index:ipos});
    } else {
        tvrow = Titanium.UI.createTableViewRow({
            height:40,
            path:'clientdetail.js' ,
            client: list[ipos]});
        }   

var title= Titanium.UI.createLabel({ 
    left:    5, 
    top:     2, 
    height:  40, 
    color:   '#000', 
    font: {fontSize: 16, fontWeight: 'bold', fontFamily: (isAndroid?'sans-serif':'Helvetica Neue')}, 
    text:    list[ipos].clientname });
    tvrow.add(title);
    data.push(tvrow);
}

var tableView = Titanium.UI.createTableView({
    data:            data,
    index:           index,
    backgroundColor:'transparent',
    separatorStyle:  Titanium.UI.iPhone.TableViewStyle.GROUPED,
    top:             1,
    width:           '99%'
});

tableView.addEventListener('click', function(e)
    {
        if (e.rowData.path)
        {
            var win = Ti.UI.createWindow({
                url:e.row.path,
                title:title.text
            });

        var clientlist = title.text;
        win.clientlist = clientlist;
        Ti.UI.currentTab.open(win);
    }
});

win.add(tableView);

最佳答案

问题出在您使用的循环中。您正在将所有内容分配给索引 ipos 处的值,该值最终是 list.length(或最后一个值),这就是为什么您总是得到那个值。为了解决这个问题,通常使用闭包并传入值,如下所示:

for ( var ipos=0; ipos<list.length;ipos++){
 (function(i){
  if( list[i].clientname[0] != curheader){
   curheader = list[i].clientname[0];

   tvrow = Titanium.UI.createTableViewRow({
    height:    40,
    path:'clientdetail.js' ,
    client: list[i],
    header:    curheader 
   });
   index.push({title:curheader, index:i});
  } else {
   tvrow = Titanium.UI.createTableViewRow({
    height:40,
    path:'clientdetail.js' ,
    client: list[i]
   });
  }   

  var title= Titanium.UI.createLabel({ 
   left:    5, 
   top:     2, 
   height:  40, 
   color:   '#000', 
   font: {fontSize: 16, fontWeight: 'bold', fontFamily: (isAndroid?'sans-serif':'Helvetica Neue')}, 
   text:    list[i].clientname 
  });
  tvrow.add(title);
  data.push(tvrow);
 })(ipos);
}

编辑

我相信您可能在新窗口中获得了错误的标题,并且它访问了最后一个可用的 title。但是,您的事件监听器可以使用公开的 title。它位于 e.row.client.clientname(尽管从外观上看它可能在 e.rowData.. 中)我相信,这意味着您应该访问对于当前选择的标题点击

var tableView = Titanium.UI.createTableView({
 data:            data,
 index:           index,
 backgroundColor:'transparent',
 separatorStyle:  Titanium.UI.iPhone.TableViewStyle.GROUPED,
 top:             1,
 width:           '99%'
});

tableView.addEventListener('click', function(e)
{
 if (e.rowData.path)
 {
  var win = Ti.UI.createWindow({
   url:e.row.path,
   title:e.row.client.clientname
  });

  var clientlist = e.row.client.clientname ? e.row.client.clientname : "No client name";
  win.clientlist = clientlist;
  Ti.UI.currentTab.open(win);
 }
});

关于javascript - 返回了意外的事件监听器结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869692/

相关文章:

php - 协助 MySQL 查询和时间戳

javascript - 如何随机化 Three.js 网格中顶点的长度?

database - 我需要将邮政编码存储在数据库中。列应该有多大?

java - 空指针异常什么时候不应该出现?

iOS 应用程序(xCode 替代品)

iOS Swift 使用 Alamofire 上传 PDF 文件(多部分)

ios - 使用 Appledocs 生成文档

Javascript - .innerHTML 更改自动关闭标签

javascript - JavaScript 中的 style.clip 随时间变化

javascript - 在 Dart 中扩展 <object>