2013-06-23 4 views
1

원격 소스에서 채워지는 tableView가 있습니다. 각 행에 여러 개의 버튼을 동적으로 추가합니다. 버튼과 각 행의 내용은 for 루프에 있습니다. 버튼 리스너 내에 경고 대화 상자 수신기가 있습니다. 확인 (예)을 선택하면이 버튼이 나타나면 버튼 제목을 변경할 수 있기를 원합니다. 이 오류의 원인이이벤트 리스너를 이벤트 리스너에 전달 중입니까?

 Uncaught TypeError: Cannot set property 'title' of undefined. 

입니다 :

나는 다음과 같은 오류가 나타날 수

 btn[i].title = "Finish" 

나는 순간에 코드에 액세스 할 수없는 및 준하지 않은 죄송합니다 많은 도움을 받아야 할 것이지만 어떤 도움이나 아이디어라도 크게 감사 할 것입니다 ...

편집 :

더미 코드 : addButton() 함수의 몸은 모든 코드가 될 것

for(i = 0; i < btn.length; i++) { 
    addButton(btn[i]); 
} 

function addButton(button) { 
    // do stuff with button 
} 

:

for(i = 0; i < btn.length; i++) { 
    // do stuff with btn[i] 
} 

변경 그것에 :

 var btn = new Array(); 

     btn[i] = Ti.UI.createButton({ 
      backgroundImage: '/images/button.png', 
      title:'Start', 
      top: 0, 
      left: 0, 
      height: '20%', 
      width: '20%' 
     }); 

     btn[i].addEventListener('click', function(e){ 
      var alert = Titanium.UI.createAlertDialog({ 
       title : 'Dialog', 
       message : 'Change Title', 
       buttonNames : ['Yes', 'No'] 
      }); 
      alert.addEventListener('click', function(e) { 
       if(e.index == 0) { 
        btn[i].title = "Finish"; 
       } 
      }); 
      alert.show(); 
     });           
     tableViewRow.add(btn[i]); 
+0

for 루프 내부의 실제 이벤트 내부에서 'i'사용과 관련된 느낌이 들기 때문에 Chrome/Firefox 또는 Firebug의 기본 디버거를 통해 실행 해 봅니다.코드를 자신의 함수에 넣고 배열과 인덱스를 전달하면 문제가 해결됩니다. – Turnerj

답변

1

어딘가에는이 같은 for 루프가 그게 하나의 차이와 함께 귀하의 for 루프에 : btn[i]button로 변경하는 모든 곳.

이 코드를 함수로 이동하면 루프가 끝난 후 btn[i]이 유효하지 않게되는 원래 코드와 달리 button 변수의 값을 필요에 따라 보존하는 "클로저"를 만듭니다.

이벤트 리스너는 원래 코드가 끝나면 오랫동안 호출됩니다. 이벤트 리스너에서 루프 인덱스를 사용하면 해당 인덱스 값이 예상 한 값이 아닙니다. 클로저는 이것을 아주 깨끗하고 간단한 방법으로 수정합니다.

당신은 루프 인덱스가 필요하다는 의견을 언급했습니다. 이 경우 다음 작업을 수행 할 수 있습니다.

for(i = 0; i < btn.length; i++) { 
    addButton(i); 
} 

function addButton(i) { 
    // do stuff with btn[i] 
} 

사실 이제 루프 본문/함수 본문의 코드를 변경할 필요가 없습니다. 이전과 같이 btn[i]을 계속 사용할 수 있습니다.

또는, 당신이 이런 식으로 수행 할 수 있습니다 이제

for(i = 0; i < btn.length; i++) { 
    addButton(button, i); 
} 

function addButton(button, i) { 
    // do stuff with button (instead of btn[i]) and i where needed 
} 

첫 번째 예에서와 같이 buttonaddButton() 기능 내부의 모든 btn[i] 참조를 대체 할 수있는, 그리고 당신이 그것을 필요로 할 때 당신은 계속 사용할 수 i이 .

+0

답변을 주셔서 감사합니다, 사용되는 루프뿐만 아니라 다른 요소에 대한 카운터입니다, 어떤 충돌을 일으킬 것입니다. 죄송합니다 매우 새로운 ... – Random

+0

인덱스를 함수에 전달할 수 있습니다. 다른 매개 변수를 지정하십시오. 예제를 추가하겠습니다. –

+0

감사합니다 마이클 ... – Random

0

for 루프 내에서 i에 클로저를 만듭니다. 루프가 끝나면 모든 생성 된 함수는 매우 동일한 var i에 클로저를 가지게됩니다.이 값은 모든 함수의 "길이"이므로 정의되지 않습니다.

관련 문제