2012-09-21 2 views
0

Backbone.js 뷰의 렌더링 기능을 동적으로 확장하려고합니다. 그렇게함으로써 렌더링이 호출되기 전과 후에 이벤트를 발생시킬 수 있기를 원합니다. 함수를 덮어 쓰려고 시도하고 작동하는 이전 함수를 호출했지만 렌더링 함수에 바인딩하는 모든 모델은 바인딩을 잃습니다. 나는 현재 다음은이 코드는, 내가 만든 Backbone.js보기에 통과했다 :Backbone.js 뷰의 렌더링 함수가 동적으로 수신 대기합니다.

function bindRenders(view) { 

    view.render = (function() { 
     var cachedRender = view.render; 

     return function() { 
      console.log("before render"); 
      cachedRender.apply(this, arguments); 
      console.log("after render"); 
     }; 
    }()); 
} 

가 다시 위의 코드가 작동하지만하여 렌더링 기능에 바인딩 된 모든 모델 :

this.model.on('change', this.render, this); 

휴식. 내가 찾은 유일한 해결책은 함수를 덮어 쓴 후 모델의 .on ('change') 이벤트를 리 바인드하는 것입니다. 그러나 모든 뷰의 모델이이 방식으로 바인딩되는 것은 아닙니다. 어떤 도움이라도 대단히 감사합니다! 감사!

답변

1

'휴식'이란 무엇입니까? 모델이 변경되면 이전 렌더링 코드가 여전히 호출됩니까?

'change'이벤트에 바인딩 된 함수가 새로운 이벤트가 아니기 때문에 변경시 실행되는 이벤트가 아닌보기의 속성 'render'를 변경하기 만하면됩니다. 바인딩이 다음과 같으면 작동 할 것입니다. this.model.on('change', function(){return this.render()}, this)

하지만 왜 그렇게하고 싶은지 알 수 없습니다. 제 생각에는 상속을 사용하여 이런 종류의 공통적 인 행동을 적용해야합니다. 같은

뭔가 또한 내가 https://github.com/tbranyen/backbone.layoutmanager 당신이 달성하고자하는 것을 많이 가지고 있다고 가정

var MyBaseView = Backbone.View.extend({ 
    ... 
    render: function(){ 
    this.trigger('beforeRender'); 
    this.beforeRender() 

    //do something generic 
    ... 

    this.afterRender() 
    this.trigger('afterRender'); 
    } 
    ... 
}); 

var MyOtherView = MyBaseView.extend({ 
    ... 
    beforeRender: function(){ 
    //do something specific 
    } 

    //do NOT override "render" 

    afterRender: function(){ 
    //do some other specific things 
    } 
    ... 
}); 

또는이 하나 Backbone.js view inheritance

같은 훨씬 더 나은 솔루션 (매우 간단).

+0

응답 해 주셔서 감사합니다. 레이아웃 관리자가 정확히 내가 뭘 찾고 있어요 :) –

관련 문제