2013-05-11 2 views
0

타일 컬렉션이 있습니다. 응용 프로그램은 수집을 시작하면 서버에서 페치와 클론은 MdApp.TilesCollection 객체의 collection 속성에 할당됩니다 :백본 : 두 컬렉션을 모두 동기화하십시오.

MdApp.TilesCollection.fetch({ 
     success: function(){ 
      console.log('Tiles collection fetched from server'); 
      console.log(MdApp.TilesCollection); 
      if(!MdApp.TilesCollection.collection){ 
       MdApp.TilesCollection.collection = new Backbone.Collection(MdApp.TilesCollection.models); 
       console.log('Made copy of collection in fetched collection instance'); 
      } 
     }, 
     error: function(){ 
      console.log('Error!Unable to fetch tiles collection from server'); 
     } 
    }); 

이 필터링 목적으로 수행됩니다

TilesCollection = Backbone.Collection.extend({ 

    model: MdApp.TileModel, 

    url : 'api/', 

    rewriteModel: function(model){ 
     this.set(model); 
    }, 

    byPrivate : function(){ 
     var filtered = this.collection.filter(function(tile){ 
      return tile.get('private') == '1'; 
     }); 
     console.log('filtered private: ' + filtered); 
     return filtered; 
    }, 

    byPublic : function(){ 
     var filtered = this.collection.filter(function(tile){ 
      return tile.get('private') == '0'; 
     }); 
     console.log('filtered public: ' + filtered); 
     return filtered; 
    }, 

    byFavourite: function(){ 
     var filtered = this.collection.filter(function(tile){ 
      return tile.get('favourite') == '1'; 
     }); 
     console.log('filtered favourite: ' + filtered); 
     return filtered; 
    }, 

    byAsc : function(){ 
     var filtered = this.collection.sortBy(function(tile){ 
      return tile.get('id'); 
     }); 
     console.log('filtered ascending: ' + filtered); 
     return filtered; 
    }, 

    byDesc : function(){ 
     var filtered = this.collection.sortBy(function(tile){ 
      return -tile.get('id'); 
     }); 
     console.log('filtered descending: ' + filtered); 
     return filtered; 
    }, 

    refilter: function(){ 
     console.log(this.collection); 
     return this.collection.models; 
    } 
}); 

내가하고 싶은 것은 유지하는 것입니다 MdApp.TilesCollectionMdApp.TilesCollection.collection이 동기화됩니다. MdApp.TilesCollection의 모델이 추가되거나 수정 될 때 해당 복제본에 대한 특정 변경을 수행하려고합니다. 물론 뭔가가 바뀔 때마다 새 컬렉션을 만들어 속성에 할당 할 수 있지만 컬렉션이 상당히 큰 경우 매우 비효율적 일 수 있습니다. 누구나 어떤 힌트 나 해결책을 버릴 수 있습니까?

답변

0

필터링을 수행하기 위해 컬렉션의 복제본을 보관할 필요가 없으며 원래 컬렉션에서 필터 작업을 수행 할 수 있습니다.

byPrivate : function(){ 
    var filtered = this.where({ private: 1 }); 
    console.log('filtered private: ' + filtered); 
    return filtered; 
} 

어떤 이유로 당신은 여전히 ​​대신 가져 오기 성공 콜백과 같이 간단히 할 수 reset가에 새 컬렉션을 만드는, 복제 및 동기화를 유지하려면 :

MdApp.TilesCollection.collection.reset(MdApp.TilesCollection.models); 
관련 문제