2011-09-16 1 views
0

나는이 문제에 대한 해결책을 찾기 위해 몇 시간을 조사해 왔습니다. prototype.js 1.6.0.1을 사용하여 테이블을 생성하고 .each 함수와 관련된 컨텍스트에서이 객체에 문제가 있습니다. 여기 snippit입니다.prototype.js의 익명 함수 안의 "this"에 관한 질문.

var Table = Class.create({ 
    initialize : function(id) { 
    this.elmnt = $(id); 
    this.rows = []; 
    }, 
    initRows : function() { 
    $A(this._elmnt.tBodies).each(function(body) { 
     $A(body.rows).each(function(row) { 
     //right here is where i would like to call 
     // this.rows.push(row); 
     console.log(this); // prints DOMWindow 
     }); 
    }); 
    } 
}); 

이이 DOMWindow에 해결 번째 .each 함수 내부에서 볼 수 있듯이. this.rows.push(row)에 전화를 걸 수 있지만 "이"가 예상대로 해결되지 않아서 전화를 걸 수 없습니다.

도움을 주시면 감사하겠습니다. 나는 내가 표준 (i = 0; i < 길이; i ++) 루프를 수행 할 수 있음을 알고 있지만 이것을 좀 더 깔끔하게하려고 노력했다. 제공 할 수있는 모든 안내에 감사드립니다.

+0

'Table' 개체에 행 모음을 유지하려는 이유가 있습니까? 'HTMLTableElement'는 이미 자체 컬렉션을 유지합니다. 'this.elmnt.rows' 또는 this.elmnt.tBodies [0] .rows'. – user113716

+0

https://developer.mozilla.org/en/DOM/table.rows – user113716

+0

이것이 내가 'each()'를 오버라이드하는 구현을 싫어하는 이유입니다. 그리고 왜 내가 커피 스크립트를 좋아 하느냐와 그 범위가 아닌 소개와 반복적 인 배열 반복 (rapating array iteration)이있다. –

답변

4

이 문제를 해결하는 가장 쉬운 방법은 initRows의 시작 this을 저장하고 each 기능

initRows : function() { 
    var self = this; 
    $A(this._elmnt.tBodies).each(function(body) { 
     $A(body.rows).each(function(row) { 
     //right here is where i would like to call 
     self.rows.push(row); 
     console.log(self); // prints DOMWindow 
     }); 
    }); 
    } 

당신이로 실행중인 문제는 this가 조작 할 수 있다는 것입니다 내에서 참조하는 것입니다 함수의 호출자. 콜백에서 매우 일반적인 것은 this을 콜백과 관련된 요소로 설정하는 것입니다. each의 경우 값의 현재 반복에 대한 요소로 설정됩니다.

self 트릭은 에 바인딩 된대로 this을 저장하고 반복에서 저장된 값을 사용하기 때문에 작동합니다.

+0

감사합니다. 덕분에 도움이되었습니다. 내가 다시이 문제에 부딪쳤다는 것을 아는 것은 좋은 일이다. var self = this에 대해 감동하지는 않지만 루프가있는 좋은 구식보다 훨씬 좋은 해결책입니다. – kwbock

+2

@grizzgreen : 변수가 마음에 들지 않으면 대신 [Prototypejs의 .bind()'메소드] ​​(http://api.prototypejs.org/language/Function/prototype/bind/)를 사용하십시오. – user113716

+0

+1 또는 * 스코프 또는 컨텍스트와 혼동하지 말아야합니다. :-) – RobG

0
initRows : function() { 
    $A(this._elmnt.tBodies).each(function(body) { 
     $A(body.rows).each((function(e, row) { 
      e.rows.push(row); 
      console.log(e); 
     }).bindAsEventListener(this, row)); 
    }); 
} 
+0

나는 이것에 동의하지 않는다. 각각에 대한 콜백은 이벤트가 아니므로'bindAsEventListener()'일 필요는 없으며'bind()'도 ['each()']의 두 번째 매개 변수 (http://api.prototypejs.org)/language/Enumerable/prototype/each /)이 문맥입니다. 그것이 바운드 된 지점에서'row'가 존재하지 않으므로 카레 될 수 없습니다.'row'는 콜백 만 존재합니다. 콜백의 컨텍스트를 바인드하려고해도 'this'를 사용하는 예제는 만들지 않습니다. 콜백 매개 변수가 잘못되어'(row, index)'이어야하며'index'는 선택 사항입니다. – clockworkgeek