Backbone Fetch не задейства събитие за промяна, когато колекцията получи нови данни

По-долу имам колекция, която извлича списък със съобщения от RESTful API. (Избрах колекция, защото в крайна сметка ще съхранява анализираните данни.)

My View е настроен да следи за промени в колекцията (т.е. когато се получи ново съобщение). Изглежда обаче колекцията не задейства събитие за промяна или задаване, когато новите данни се съхраняват. Регистрирал съм колекцията преди и след това, за да потвърдя, че нейният атрибут за резултати е променен.

Няколко въпроса:

  1. Защо събитие „промяна“ не се случва, когато се получат уникални данни?
  2. Очаквам да стартирам setInterval на моята функция fetchMessages, за да проверявам непрекъснато за актуализирани данни от сървъра. Има ли по-добър начин за проверка за актуализации в Backbone?

Благодаря за вашата помощ!

Колекция

var AllMessages = Backbone.Collection.extend({

  model: Message,
  url: 'http://arestfulapi.com',

  fetchMessages: function(){
    var that = this;
    this.fetch({
      data: {
        'order': '-createdAt',
        'limit': 10
      },
      success: function(model, data){
        // we want the array in data.results
        that.set(data.results) // this should trigger a change event ?
      }
    });
  }
});

Преглед

var MessageViewer = Backbone.View.extend({

  initialize: function(){
    this.collection.on('change',this.log,this); // does not get called from above
  },

  log: function(e){
    console.log('triggered');
  }

});

Инстанция

var allMessages = new AllMessages();
var messageViewer = new MessageViewer({collection:allMessages});

person arami    schedule 11.10.2013    source източник
comment
Нямаш модел, имаш колекция, това е малко по-различно. Когато говорите за актуализиране на атрибути, нямате ли предвид моделите, които се добавят към тази колекция? Също така, не използвайте reset така. Вместо това използвайте флага {reset: true} при извличане. Тук всъщност казвате на Backbone да направи интелигентна актуализация на вашата колекция и след това да я нулира веднага след това. Сега, ако използвате флага за нулиране, ще можете също да слушате събитието reset. Но като видя какъв код имате, не съм сигурен, че наистина искате да нулирате колекцията си...   -  person Loamhoof    schedule 11.10.2013
comment
Трябваше да отбележа, че API е RESTful и отговаря с пълен списък от обекти, включително тези, които вече имам. Възможно ли е Backbone да провери този списък за разлики между моята колекция и (потенциално) актуализирания списък?   -  person arami    schedule 11.10.2013
comment
Да, така е и е поведението по подразбиране (стартиране на Backbone 1.0, ако не греша). Backbone просто ще провери идентификаторите, за да го направи. За да цитирам документа: Когато данните за модела се върнат от сървъра, той използва set за (интелигентно) обединяване на извлечените модели.   -  person Loamhoof    schedule 11.10.2013
comment
Как да пренапиша този код, така че Backbone да намери тези промени и да задейства събитието „промяна“?   -  person arami    schedule 11.10.2013
comment
сигурен ли си, че задейства събитие "set"? Опитайте да слушате събитието „промяна“?   -  person Vic    schedule 12.10.2013


Отговори (1)


Решен:

Според Каталога със събития на Backbone.js:

  • "добавяне" се задейства, когато модел е добавен към колекция.
  • "промяна" се задейства, когато атрибутите на модела са променени.

Тъй като тази колекция има модели, добавени към съществуващ атрибут („модели“), вместо да има променени атрибути, това задейства събитие „добавяне“. Това, че първоначалният атрибут 'models' съдържа празен масив, не е от значение тук.

person arami    schedule 11.10.2013