function getThings()
{
// show activity indicator
// create an empty data array
var data = [];
// create an empty results array
var results = [];
// create the httpRequest
var titleLabel = [];
var dex = [];
var xhr = Titanium.Network.createHTTPClient();
// open the httpRequest
xhr.open('post','http://jhcweb.co.kr/test4.php');
// this method will be called when the request is complete
xhr.onload = function(){
// hide activity indicator
// parse json coming from the server
var json = JSON.parse(this.responseText);
// if things are returned
if(json.things)
{
// loop through all of our things
for (var i = 0; i < json.things.length; i++)
{
dex[i] = json.things[i].idx;
// create a new table row
var row = Ti.UI.createTableViewRow();
// create a label inside the table row
titleLabel[i] = Ti.UI.createLabel({
text: json.things[i].name,
left: 10,
top: 10,
height: 40,
width: 210,
value:json.things[i].idx
});
row.add(titleLabel[i]);
// push the row object to the data array
data.push(row);
titleLabel[i].addEventListener("click",function(e){
alert(i);
var win = Alloy.createController("view",{idx:dex[i]}).getView();
win.open();
});
}
// populate the things table with data
$.thingsTable.data = data;
}
};
// this method will be called if there is an error
xhr.onerror = function()
{
alert(this.error + ': ' + this.statusText);
return false;
};
xhr.send();
}
getThings();
$.select.open();
코드는 아래 글에 나온 방법처럼 하면 코드가 이쁘게 보입니다.
개인적으로 가장 추천하는 방법은
``` (키보드 1옆의 키 세번)을 코드 맨 첫줄과 맨 아랫줄에 넣으면 됩니다.
클로저
이 코드의 가장 큰 문제점은 바로 아래 부분에 있습니다.
for (var i = 0; i < json.things.length; i++) {
// 생략
titleLabel[i].addEventListener("click", function(e) {
alert(i);
// 생략
});
}
클로저로 인해서 그 무든 이벤트 핸들러 함수가 실행 될때마다 똑같은(=json.things.length)가 나온다는 겁니다. 핸들러 내부에서 참조하는 i는 스코프체인의 해당 함수 실행 컨텍스트가 아닌 스코프체인에서 상위 스코프에 존재합니다. 그래서 모두 같은 i를 참조하게 됩니다.
아래 링크를 참조하세요. developer.mozilla.orgd 의 클로저 설명 글 중 자주하는 실수 부분과 동일한 원인입니다.
event listener
위에서 처럼 모든 label에 전부 event 리스너를 거는 것 보다 tableview의 click을 이용해서 넘어오는 정보로 해당 row나 클릭 ui 콘트롤이 무엇인지 확인하는 방법이 더 좋습니다.
listview vs. tableview
특별히 tableViewRow 내부의 view에 대해 property 변경이 아닌 직접적인 view의 함수를 호출해야하는 경우가 아니거나 tableview의 scroll 정보를 아주 디테일하게 알아야하는 경우가라면 listview 사용을 추천합니다. 훨씬 성능이 좋습니다.