2013-01-07 5 views
0

몇 가지 백본 컬렉션을 사용하고 있으며 일부 기준에 따라 일부를 액세스해야하는 경우가 있습니다.Backbone.js 컬렉션 필터링

METHOD 1

로서 이미 자체가 모델의 배열이 아닌 다른 콜렉션을 리턴하는 컬렉션 filter()를 사용 this question에 기재. 이것은 단순한 경우에도 작동 할 수 있지만 일반 모델 배열에는 컬렉션에 정의 된 모든 메서드가 포함되어 있지 않으므로 컬렉션의 메서드 연결이 끊어지는 효과가 있습니다.

방법이

그 질문에 대한 대답은 생성자에 모델의 배열을 전달 새 컬렉션을 만들 것을 제안했다. 이 작동하지만 컬렉션의 생성자를 호출 할 때마다 부작용이 있으므로 컬렉션에 필터 할 때마다 정의 된 모든 이벤트 바인딩이 스택됩니다.

그럼 일부 필터 기준에 따라 하위 모음을 만드는 올바른 방법은 무엇입니까?

메소드 체인을 사용하는 대신 방법 1을 사용하고 필터링 방법을 더 만들어야합니까?

방법 2를 사용해야하고 컬렉션의 생성자에서 이벤트를 바인딩하지 않아야합니까?

답변

1

개인적으로 컬렉션에 더 많은 필터링 방법을 만들 것입니다. 컬렉션 안에 로직을 캡슐화하는 추가 이점이 있기 때문입니다.

기존 컬렉션을 다시 사용할 수도 있습니다. 내가 아이디어를 주위 놀겠다는 거, 그리고 이런 일에 도착 :

var Collection = Backbone.Collection.extend({ 
    //Takes in n arrays. The first item of each array is the method you want 
    //to call and the rest are the arguments to that method. 
    //Sets the collection.models property to the value of each successive filter 
    //and returns the result of the last. Revers the collection.models to its original value. 
    chainFilters: function(/*args..*/) { 
    var models = this.models; 
    try { 
     filters = _.toArray(arguments); 
     _.each(filters, function(filter) { 
     this.models = filter[0].apply(this, _.rest(filter)); 
     }, this); 
    } catch(err) { 
     this.models = models; 
     throw err; 
    } 

    var filtered = this.models; 
    this.models = models; 
    return filtered; 
    } 
}); 

사용법 :

var results = collection.chainFilters(
    [ collection.filter, function(model) { return model.get('name') === 'foo'; } ], 
    [ collection.someMethod, 'someargument' ], 
    [ collection.someOtherMethod ] 
); 

Here's a working sample. 그것은 조금 특이 해, 나는 알고있다.

0

사용 사례에 따라 다릅니다. 이러한 모델로 뷰를 업데이트하려면 새 컬렉션을 원할 수도 있습니다. 그렇지 않으면 좋은 반응 템플릿 업데이트를 얻지 못할 수 있습니다. 단순히 데이터 모델링을 반복하지 않고 모델을 반복하거나 조작하려는 경우 array + underscore.js를 사용하십시오.

배열로 사용해 보시고 컬렉션에 있지만 underscore.js에는없는 기능이있는 보일러 플레이트 코드를 많이 작성 하셨다면 컬렉션을 사용하기 시작하십시오.