Метод Backbone Collection fetch() переопределяет предыдущие модели при повторном вызове

Я использую метод выборки backbone.js Collection для отправки запроса на возврат данных на основе смещения и лимита. Первый метод collection.fetch() возвращает 5 моделей, потому что LIMIT 0 и LIMIT 5, и при повторном вызове Backbone.Collection.prototype.fetch.call(this, options) он возвращает те же данные (предыдущие модели), но ответ сервера со следующим OFFSET=5 и LIMIT=5, т.е. следующий набор объектов. Но я хочу добавить в объект коллекции всякий раз, когда вызывается метод выборки.

define([
  'underscore',
  'backbone',
  'utils',
  'core/base/models-and-collections',
  'core/constants'
], function(_, Backbone, Utils, CollectionUtils, Constants) {

    var Collection = Backbone.Collection.extend({
        
        initialize: function(models, options) {
            this.options = options;
            _.bindAll(this, 'parse', 'url', 'pageInfo', 'nextPage');
            typeof(options) != 'undefined' || (options = {});
            typeof(this.limit) != 'undefined' || (this.limit = 5);
            typeof(this.offset) != 'undefined' || (this.offset = 0);
            typeof(this.size) != 'undefined' || (this.size = 5);
            console.log("photo-collection-intitalize");
        },

        url: function() {
            console.log("photo-collection-url-hit");
             // if (this.size === this.limit) {            
                return Utils.keywordFormat("/api/student/{studentId}?limit={limit}&offset={offset}", {
                    studentId: this.options.studentId,
                    limit: this.limit,
                    offset: this.offset
                });           
        },
    
        nextFetch: function(options) {
            console.log("next fetch method");
          typeof(options) != 'undefined' || (options = {});
           var self = this;
          var success = options.success;
          options.success = function(resp) {
            if(success) {
                success(self, resp);
                console.info("-collection response on success");
                console.info(resp);
                }
          };
          return Backbone.Collection.prototype.fetch.call(this, options);
           
        },
    
        pageInfo: function(){

        },

        nextPage: function(){

        },

        parse: function(resp) {
            console.info(resp);
            if(!resp.items) {
                console.error("items not specified", resp);
            }
            console.log("resp:limit "+resp.limit+ "resp: offset "+ resp.offset);
            this.size= resp.limit;
            return resp.items;
        },

    });

    return Collection;

});

this.collection= new Collection();
this.collection.once("sync",this.GetFirstSetOfData,this);
this.collection.fetch();


GetFirstSetOfData: function(collection){
  
  //set view  
  
}

//set next data offset
this.collection.offset=this.collection.offset+this.collection.limit;
//call again fetch method
var newCollection=this.collection.nextFetch();

//new Collection is same data as previous this.collection have but server response next set of data 
// i,e row 5-9

1 ответ

Я хотел бы сделать что-то вроде этого, когда выборка успешна, она вызывает событие синхронизации. Поэтому каждый раз, когда он успешен, вы можете увеличивать счетчик смещения:

offsetStep: 5,

initialize: function() {
    this.on('sync', this.incrementOffset);
}

incrementOffset: function() {
    this.offset += this.offsetStep;
}

Тогда вместо того, чтобы nextFetch метод вам просто нужно пройти {add: true} при извлечении - это объединит новые модели с сервера, если они имеют уникальные идентификаторы:

myCollection.fetch({ add: true });
Другие вопросы по тегам