2013-05-11 2 views
0

У меня есть коллекция плиток. Когда приложение начинает сбор скачивается с сервера и его клон присваиваются collection свойства MdApp.TilesCollection объекта:Магистраль: синхронизировать обе коллекции

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.TilesCollection и MdApp.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); 
Смежные вопросы