2013-02-12 2 views
7

На основе официальной документации, когда я делаю что-то вроде этого:Обновление коллекции с использованием выборки с позвоночником

collection.fetch({update: true, remove: false}) 

я получаю «добавить» событие для каждой новой модели, и «изменить» событие для каждого изменила существующую модель, не удаляя ничего.

Почему, если я вызываю статический источник данных (URL-адрес коллекции всегда возвращает тот же json), вызывается событие add для каждого полученного элемента?

Вот некоторый код (я ничего не делаю, я просто отладки):

<!doctype html> 
<html> 
    <head> 
    <title>Example</title> 
    </head> 
    <body> 
    <a href="#refresh">Refresh</a> 
    <script src="js/jquery-1.8.3.min.js"></script> 
    <script src="js/underscore-min.js"></script> 
    <script src="js/backbone-min.js"></script> 
    <script src="js/main.js"></script> 
    </body> 
</html> 

Heres в JS

(function($){ 
    //Twitter Model 
    ModelsTwitt = Backbone.Model.extend({}); 
    //Twitter Collection 
    CollectionsTwitts = Backbone.Collection.extend({ 
     model:ModelsTwitt, 
     initialize:function(){ 
      console.log('Twitter App Started'); 
     }, 
     url:'data/195.json' 
    }); 
    //Twitts View 
    ViewsTwitts = Backbone.View.extend({ 
     el:$('#twitter-list'), 
     initialize:function(){ 
      _.bindAll(this, 'render'); 
      this.collection.bind('reset',this.render); 
      this.collection.bind('add',this.add); 
     }, 
     render:function(){ 
      console.log("This is the collection",this.collection); 
     }, 
     add:function(model){ 
      console.log("add event called",model); 
     } 
    }); 
    //Twitter Router 
    Router = Backbone.Router.extend({ 
     routes:{ 
      '':'defaultRoute',//Default list twitts route 
      'refresh':'refreshView' 
     }, 
     defaultRoute:function(){ 
      this.twitts = new CollectionsTwitts(); 
      new ViewsTwitts({collection:this.twitts}); 
      this.twitts.fetch(); 
     }, 
     refreshView:function(){ 
      this.twitts.fetch({update:true,remove:false}); 
     } 
    }); 
    var appRouter = new Router(); 
    Backbone.history.start(); 
})(jQuery); 

В принципе, я принести коллекцию с помощью defaultroute, он правильно загружается со всеми моделями и атрибутами.

И когда я нажимаю ссылку обновления, я вызываю refreshView, который в основном пытается обновить коллекцию новыми моделями. Я не понимаю, почему, если ответ тот же, все модели коллекции обнаруживаются как новые, вызывая add?

Heres a functional link: Откройте консоль, и вы увидите, как вызываются события добавления, когда вы нажимаете кнопку «Обновить», даже если коллекция одинакова.

Благодарим за помощь.

ответ

12

Мое предположение, что ваши модели не имеют idAttribute(doc). По умолчанию используется базовая линия id, а ваши записи JSON не имеют одного, поэтому он не может определить, какие модели уже есть.

Попробуйте изменить модель для этого (или другой ключ, если это один не единственный):

ModelsTwitt = Backbone.Model.extend({ 
    idAttribute: 'id_event' 
}); 
+2

да, это проблема. Спасибо за помощь. – DiegoDevelopero

+0

Привет там .. У меня есть все мои модели, коллекции и представления в '$ (document) .ready();' Я также использую Backbone.router.extend. Всякий раз, когда я обновляю текущую страницу, она остается на текущей странице. Никаких проблем с этим. Но при обновлении модели и коллекции снова сбрасываются .. а затем его пустые .. поэтому я не могу получить, что я ранее хранил в коллекции. Что мне делать? –

Смежные вопросы