2012-06-08 2 views
0
var JavascriptHelper = Backbone.Model.extend("JavascriptHelper", 
     {}, // never initialized as an instance 
     { 
      myFn: function() { 
       $('.selector').live('click', function() { 
        this.anotherFn(); // FAIL! 
       }); 
      }, 

      anotherFn: function() { 
       alert('This is never called from myFn()'); 
      } 
     } 
    ); 

이 모델을 인스턴스로 사용하지 않으므로 여기서는 일반적인 _.bindAll(this, ...) 접근 방식이 작동하지 않습니다. 어떤 아이디어? 감사.백본 : 콜백 내부의 모델에 대한 'this'에 대한 참조를 유지하는 가장 쉬운 방법

+0

그 .myFn 및 .anotherFn 소품을 가지고 있지만 DOM 요소 인 jQuery는 이벤트 처리기로 전달됩니다. myFn 레벨 (jQuery의 .live에 전달하는 핸들러 함수 외부)에서'var that = this;'를 시도한 다음 핸들러 내부에서'that.anotherFn()'을 사용하면 작동합니다 (Backbone이 명시 적으로 확장 된 객체를 다른 것으로 불행하게 만듭니다.) – Alexander

답변

1

당신은 손으로 할 수있는 : anotherFnthis가 호출 될 때 어떤 상관하지 않을 경우,

myFn: function() { 
    $('.selector').live('click', function() { 
     JavascriptHelper.anotherFn(); 
    }); 
} 

를 또는 (또는이 live 사용하는 것을 할 this을 원하는 경우) :

myFn: function() { 
    $('.selector').live('click', JavascriptHelper.anotherFn); 
} 

제쳐두고 live은 (는) on으로 대체되었습니다. 또한 JavascriptHelper를 인스턴스화하지 않으면 왜 백본 모델입니까? 모델은 전혀 없습니까? 왜 문자 간단한 물건을 사용하지 :

var JavascriptHelper = { 
    myFn: function() { 
     //... 
    }, 
    anotherFn: function() { 
     //... 
    } 
}; 

그리고이 구조 기대하고 무엇을 :

var JavascriptHelper = Backbone.Model.extend(string, {}, {...}) 

JavascriptHelper 당신에게 떠날를? 문자열을 확장하는 것은 이상하지만 Backbone.Model.extend에 세 개의 인수를 전달하는 것은 의미가 없습니다. it only cares about two arguments. 그런 다음 정적 속성을 원하는 경우에 당신은 the second argument로 전달해야합니다

에 관계없이 (내가 익숙 해요) 백본의 내부 동작,`this.anotherFn()가`객체를 참조하지 않을의
var JavascriptHelper = Backbone.Model.extend({}, { myFn: ... }); 
+0

혼란에 대해 유감스럽게 생각합니다. 실제로 Parse를 사용하지만 사람들을 혼동하고 싶지 않았습니다. 그래서 Parse.Object의 모델을 사람들이 더 쉽게 이해할 수 있도록 Parse는 Backbone의 확장입니다.) 큰 충고! 나는 모든 도우미를 객체 리터럴로 바꾸고있다. 고마워요! – Garrett

관련 문제