2013-07-18 107 views
1

我正在将项目推送到数据数组,然后将这些项目添加到rowData数组中以便为表创建自定义行。我需要知道如何在用户点击特定行时访问这些内容。我以前使用e.rowData,title等来访问这些元素时,我有一个基本的表,但现在它是一个自定义表,这是行不通的。不要担心解析位,一切正常。所有帮助赞赏!访问TableView的自定义行

data.push({ 

      title: items.item(i).getElementsByTagName("title").item(0).text,    
     leftImage: str.match(patt1) !== null ? str.match(patt1)[0] : 'image_news.png', 
      dataToPass: items.item(i).getElementsByTagName("description").item(0).text, 
      hasChild: true, 
      js:"external.js" 
     }); 



    } 

    var rowData=[]; 

    for(i=0;i<data.length;i++){ 
     var img= Titanium.UI.createImageView({ 
      image:data[i].leftImage, 
      left:0, 
      bottom:5, 
      height: 100, 
      width: 100 
     }); 

     var bgBar=Titanium.UI.createView({ 
      height:110, 
      width: "100%", 
      bottom:0, 
      left:0, 
      backgroundColour: "#000", 
      opacity: 0.6 
     }); 

     var title=Titanium.UI.createLabel({ 
      text:data[i].title, 
      color: 'black', 
      left: 105 
     }); 

     var row=Titanium.UI.createTableViewRow({ 
      height: "auto", 
      hasChild: "true", 
     js:"external.js", 
     dataToPass: data[i].dataToPass 
     }); 

     row.add(img); 
     row.add(bgBar); 
     row.add(title); 



     rowData.push(row); 
     console.log("row shiznick" + rowData); 
    } 


    tableView.setData(rowData); 


tableView.addEventListener("click", function (e){ 
     console.log("HERE SOURCE.TITLE ------------------"+e.row.title); 
     console.log("YOYOOYOYO------------"+e.source.title); 
     console.log("IS THIS IT---------------"+e.children[0]); 
     console.log("HERE IS THE SOURCE -----------------------------"+ e.source); 
     console.log("HERE SOURCE.LEFTIMAGE REG EXP3 ------------------"+e.row.leftImage); 
     console.log("HERE SOURCE.ClassName ------------------"+e.source.className); 
     console.log("HERE HASCHILD ------------------"+e.rowData.hasChild); 
     console.log("HERE DATATOPASS ------------------"+e.row.dataToPass); 
}); 

回答

2

有两种方法来设置一个表中的行,你可以创建自定义行,或者创建拥有的JSON对象行对象的属性。这两种情况下具有访问该行的不同的方式,无论是row对象或rowData对象,from the docs

当创建隐式地使用JavaScript字典对象的行中,使用[在rowData性质],而不是行访问任何自定义行属性。 下面是隐式创建行的示例,这不是推荐的方式。

在你的榜样,因为你没有创建行对象含蓄,但明确的,你可以从事件中这样的row属性访问点击行:

tableView.addEventListener("click", function(e){ 
    // Get the [TableViewRow](http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.UI.TableViewRow) object 
    var theRow = e.row; 
    // Get the children 
    var rowChildren = theRow.children; 
    // Here are your objects in the row 
    var imgInRow = rowChildren[0]; 
    var bgBarInRow = rowChildren[1]; 
    var titleInRow = rowChildren[2]; 
    // Here is the title 
    var rowTitle = titleInRow.text; 
}); 

另外,在这两个的情况下,你总是可以使用索引来查找行对象是这样的:

tableView.addEventListener("click", function(e){ 
    // Get the index of the row 
    var ndx = e.index; 
    // Get the row, this only works if you have not added sections 
    var row = tableView.data[ndx]; 
}); 
+0

做一个jsfiddle非常感谢您的回复。我唯一的问题是我不确定如何访问dataToPass。我试过\t var dataToPassInRow = rowChildren [3];和dataToPassInRow.text,但这是导致错误?我认为这是因为我没有像其他人一样添加此属性。有什么我失踪? – user2363025

+0

也为了访问图像,我尝试了console.log(imgInRow.text),它返回undefined。 console.log(imgInRow.image)但这是返回[对象imageView],我试着console.log(imgInRow.image.text),这是返回undefined – user2363025

+0

hmm e.rowData似乎适用于dataToPass。这很混乱。我仍然无法获取图像,虽然 – user2363025

-1

尝试使用event.taget功能,是这样的:

$(".row").click(function(event) { 
    var element = event.target; 
    // Accessing element 
}); 
+0

是jQuery的? – user2363025

+0

不,它是javascript,访问一个dom属性。 – Hernandcb

+0

这使得应用程序崩溃。我没有收到任何具体的错误信息 – user2363025

1

为了访问行的DATAS当用户点击(甚至是那些未在自定义行的情况下显示例如),您可以创建一个数组,在循环过程中将数据加入其中,并使用e.index访问数据。 一个简单的代码例如:

var allDataArray = []; 

     // loop through each item 
     for (var i = 0; i < items.length; i++) 
     { 
      // Your source datas (custom row : id is not displayed in the rows) 
      var sourceData = { 
       id: items.item(i).getAttribute('id'),    
       title: items.item(i).getElementsByTagName("title").item(0).textContent, 
      }; 

      // Saving data for each loop 
      allDataArray.push(sourceData); 
} 

然后访问数据

itemsTable.addEventListener('click', function(e) 
     { 
      // Target the array with e.index offset 
      var rowContent = allDataArray[e.index]; 
      Ti.API.info(rowContent); // will display every single data of the current row clicked 
      alert(rowContent.id) // will display the "hidden" id which was not displayed in the UI 

}