2012-02-09 3 views
4

사용자 정의 Backbone.View 클래스로 추상화하고 싶은 공통 코드가있는 뷰가 몇 개 있습니다. 이 작업을 수행하는 모범 사례가 있습니까?Backbone.View 서브 클래 싱

이 같은 작업을 수행하기에 좋은 패턴입니까? :

// Base Grid view 
var GridView = Backbone.View.extend({ 
    initialize : function(){ 
       //common view init code .. 

       //do the plug in overrides 
       if (options.addHandler) 
        this.addHandler = options.addHandler; 
       if (options.events) 
        //?? extend default events or override? 
        this.events = $.extend(this.events, options.events); 
       }, 
    addHandler : function() { 
       //defaulthandler this code can be overridden 
       }); 
}); 


// in another object create some views from the GridView base 
.... 
var overrides = { events:"xxx yyy", el: ulElement addHandler: myAddFunction } 
var UserList = GridView.extend(overrides) 
var userList = new UserList(users, options); 
.... 

var coursesOverrides : {addHandler: ...} 
var coursesOptions: {el: courseElement, ...} 
var CourseList = GridView.extend(coursesOverrides) 
var courseList= new CourseList (courses, coursesOptions) 

// along the same lines maybe there's an abstraction for toolbar views 
var ClassToolbarView = ToolbarBase.extend(toolOverrides) 
var classtoolbar = new ClassToolbarView(actions, toolbaropts) 

일반적인보기 코드를 리팩토링하기 위해보기를 확장하는 좋은 예를 보여주는 포인터입니다.

답변

4

먼저, initializer()에 전달되는 옵션이 표시되지 않으므로 버그입니다.

var GridView = Backbone.View.extend({ ... }) 
var GridViewWithNewFunctionsAndEvents = GridView.extend({ ... }) 

그리고 당신은 백본 주식을 연장처럼 교체하거나의 GridView의 기능을 확장하고, new GridViewWithNewFunctionsAndEvents()를 호출하고 당신이 필요로하는 새로운 객체에 추가 기능을 얻을 수 있습니다 :

둘째, .extend() 방법은 상속 수업보기. 당신이 초기화를 확장해야하는 경우

, 당신은 슈퍼 클래스의 초기화를 호출하는이 작업을 수행 할 수 있습니다

var GridViewWithNewFunctionsAndEvents = GridView.extend({ 
    initializer: function(options) { 
     GridView.prototype.initializer.call(this, options); 
     /* Your stuff goes here */ 
    } 
    }); 
+0

죄송 조기 there..saved 일부 의사는 내가 약간의 편집을했다. 나는 오버라이드를 처리하기 위해 생각하는 패턴의 요지를 얻는다. 뷰 이벤트 문자열에 대해 특별한 작업을 수행해야합니까? – claya

+0

예. 만약 당신이 그것들에 추가하려고한다면, 당신은 이니셜 라이저에서 그것을 할 필요가 있습니다 :'_.extend (this.events, { 'event domobject': 'handler', ...})'그렇지 않으면, 상위 클래스에서 전체 이벤트 목록을 복사합니다. 'delegateEvents()'는'initializer' 이후에 발생하므로, 그 후에 아무것도 할 필요가 없습니다. –