2012-02-19 3 views
17

모델 또는 DOM에서 변경된 사항없이 backbone.js "이벤트"를 발생시키는 방법을 찾고 싶습니다.Backbone.js보기 이벤트 올리기

예를 들어 Facebook SDK를 비동기 적으로로드하고 있습니다. auth.login 이벤트에 가입되어 있으며 사용자가 로그인 한 내보기에 메시지를 보내서 적절하게 다시 렌더링 할 수 있습니다.

내보기는이 유사하게 나타납니다 window.view가 존재하는 동안

FB.Event.subscribe('auth.login', function(response){ 
    if (response.status === 'connected') { 
     var uid = response.authResponse.userID; 
     var accessToken = response.authResponse.accessToken; 
     window.signedRequest = response.authResponse.signedRequest; 

     if (window.view && window.view.setSignedRequest) { 
      window.view.setSignedRequest(window.signedRequest); 
     } 
    } 
    }); 

그러나,이 setSignedRequest 방법을 볼 수 없습니다 :

내 페이스 북의 코드에서
window.CreateItemView = Backbone.View.extend({ 
    el: $('#content'), 
    initialize: function() { 
    this.render(); 
    }, 
    render: function() { 
    // do something 
    return this; 
    }, 
    setSignedRequest: function(signedRequest) { 
    //do something with signedRequest 
    } 
}); 

, 나는 이것이 않습니다. 스크립트가 올바른 순서로로드되었는지 확인했습니다. 이상하게도 다른 뷰 객체에도 불구하고 다른 페이지에이 동일한 코드가 있는데 제대로 작동합니다. 나는 이것을 설명 할 차이를 보지 못했습니다.

더 나은 해결책은 일종의 이벤트를 발생시키고 뷰에서 수신 대기하는 것입니다. 그러나 signedRequest는 모델의 속성이 아니어야하므로 모델에서 change 이벤트를 사용하고 싶지 않습니다. 이것을 성취하는 더 좋은 방법이 있습니까?

+2

글쎄,'.trigger()'메소드가 있습니다. 나중에 볼 수있는 맞춤 이벤트를 시청자가들을 수 있도록 설정할 수 있습니다. –

답변

28

Backbone.View는 당신이보기에 방법을 볼 수없는 이유를 모르겠어요하지만 당신은 쉽게 사용자 정의 이벤트를 트리거하고

var View = Backbone.View.extend({ 

    initialize: function() { 

     this.on('customEvent', this.doSomething, this); 
    } 

    doSomething: function(someData) { 

     // this! 
    } 
}); 

var view = new View(); 

view.trigger('customEvent', "someDataHere"); 

을 원하는대로 데이터를 전달할 수있는 의미 Backbone.Events로 확장 - 그것은해야 작품 -보기를 올바르게 인스턴스화하고 있습니까? window.viewCreateItemView의 인스턴스입니까? 당신이 당신의 모델 밖에서 그렇게하고 다음 작업을 수행 할 수있는보기의 이벤트에 가입하고자 할 경우

10

: 다음

var SomeObject = {...}; 
_.extend(SomeObject, Backbone.Events); 

을, 당신은

SomeObject.on('myevent', someFunc, this); 

SomeObject의

에 이벤트를 구독 할 수 있습니다 또는 이벤트를 트리거하십시오.

SomeObject.trigger('myevent', data); 
관련 문제