2013-06-25 3 views
2

여러 개의 일반 특성, 일부 중첩 된 모델 및 몇 개의 모음이있는 백엔드에서 제공되는 복잡한 모델이 있습니다.필터와 이벤트가있는 하나의 기본 모음에 여러 개의 모음이 묶입니다.

내 페이지에는 유효하지 않은 항목 및 유효한 항목에 대한 두 개의 표가 있습니다. 문제의 항목은 중첩 된 컬렉션 중 하나에서 가져온 것입니다. baseModel.documentCollection이라고하고, DocumentsCollection을 구현해 봅시다.

var invalidDocsCollection = new DocumentsCollection(
    baseModel.documentCollection.filter(function(item) { 
      return !item.isValidItem(); 
    }) 
); 

var invalidTableView = new BookIn.PendingBookInRequestItemsCollectionView({ 
    collection: app.collections.invalidDocsCollection 
}); 

layout.invalidDocsRegion.show(invalidTableView); 

이 실제로 괜찮지 :

그래서 제가했던 것은 다음과 같은합니다 ('유효'사건에 대한 중복 참고)이며, 내 Marionette.CompositeView의 어떠한 여과 코드를 원하지 않는다 하나의 기본 모음에서 두 개의 테이블을 독립적으로 채 웁니다. 하지만 전체 이벤트 파이프 라인을 기본 컬렉션으로 가져 오는 것은 분명하지 않습니다. 즉, 문서의 유효성이 변경되면 다른 컬렉션으로 이동하는 깔끔한 방법이 없으므로 다른보기가됩니다.

나는 필터 컬렉션을 가질 수있는 기본 컬렉션을 가지고있는 좋은 방법입니다. 어떤 제안?

답변

1

나는 이전의 시도를 마무리하고 필요한 것을 수행하는 Backbone.Collection 확장을 제안했습니다.

collections.FilteredCollection = Backbone.Collection.extend({ 
    initialize: function(items, options) { 
     if (_.isUndefined(options.baseCollection)) 
      throw "No base collection to watch"; 
     if (!_.isFunction(options.filterFunc)) { 
      throw "No filter to apply"; 
     } 
     _.extend(this, options); 
     this.listenTo(this.baseCollection, 'all', this.reraise); 
    }, 
    reraise: function (event) { 
     this.reset(this.baseCollection.filter(this.filterFunc), { silent: true }); 
     var args = [].slice.call(arguments, 1); 
     this.trigger(event, args); 
    } 
}); 

나는이와 가지고있는 하나의 작은 문제는 내가 수동으로 다음의 baseCollectionfilterFunc을 적용됩니다 FilteredCollection를 인스턴스화 할 때 items 매개 변수로 그에서 통과해야한다는 것입니다,하지만 그건 내가 살 수 뭔가.

아래 코드는 내가 인스턴스화하는 데 사용하는 코드입니다. 단 하나의 유효 항목 만 수집하는 것과 거의 다른 정확한 사본이 있지만 모든 필터를 적용 할 수 있습니다.

var allDocs = theModel.get('Documents'); 

var invalidOptions = { 
    baseCollection: allDocs, 
    filterFunc: function(item) { 
     return !item.isValidItem(); 
    } 
}; 

var invalidDocs = allDocs.filter(invalidOptions.filterFunc); 
var invalidDocsCollection = new collections.FilteredCollection(
    invalidDocs, invalidOptions 
);