Backbone fetch 每次都会删除和读取相同的模型

Backbone fetch removes and readds the same models every time

我有一个 'business' collection 传递给多个视图。

当我 运行 this.business.fetch() 时,返回的模型完全相同但是事件 'add' 和 'remove' 被触发,因为 collection认为返回的模型是新的,因此它删除了 'old' 并添加了 'new' 模型。我能看到的模型之间的唯一区别是 cid。

为什么 fetch 认为 collection 已经改变?即使没有?

这是我的代码:

router.js
var Router = Backbone.Router.extend({
routes: {
    "home": "home",
}
initialize: function() {
  this.business = new Business();
  this.business.fetch();
},
home: function() {
  var homepageView = new HomePageView({business: this.business});
},

.

HomePageView.js
var HomePageView = Backbone.View.extend({
initialize: function (options) {
  this.business = options.business;
  this.listenTo(this.business, "add",    this.onBusinessAdd);
  this.listenTo(this.business, "remove", this.onBusinessRemove);
  this.listenTo(this.business, "change", this.onBusinessRemove);
  this.business.fetch();
},
onBusinessAdd: function(model) {
  console.log(model);
},
onBusinessRemove() & onBusinessChange() are the same as onBusinessAdd()

.

collection/business.js
var BusinessCollection = BaseCollection.extend({
initialize : function() {
  this.urlRoot = this.path + 'business/me';
  this.url = this.path + 'business/me';
  this.model = BusinessModel;
}

.

我有一个不同的 collection 叫做项目,而且非常适合。但出于某种原因,当 i 运行 business.fetch() 在第一次获取时,它添加了 2 个业务 cid 19 和 20,然后在第二次获取时,它删除了 cid 19 和 20 并添加了 cid 23 和24 即使它们相同

我在我的控制台中得到以下信息:

first fetch: (router.js)
"onBusinessAdd"
n {cid: "c19", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}
n {cid: "c20", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}

second fetch: (homepageview.js)
"onBusinessRemove"
n {cid: "c19", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}
n {cid: "c20", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}
"onBusinessAdd"
n {cid: "c23", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}
n {cid: "c24", attributes: Object, collection: n, _changing: false, _previousAttributes: Object…}

。 "c19" == "c23" 和 "c20" == "c24"

的属性
Object {_id: "567b6997a58029fc087b1716", hasLogo: false, approved: false, postcode: "2131", suburb: "1231321"…}
__v : 0
_id : "567b6997a58029fc087b1716"
approved : false
created : 1458794097462
email : "f@f.com"
hasLogo : false
name : "afsaf"
phone : "0123456789"
postcode : "2131"
reservationlist : Array[1]
settingsSchema : Array[1]
staff : Array[1]
street : "123132"
suburb : "1231321"
waitlist : Array[1]

.

.

这给我带来了问题,因为每次调用 onBusinessAdd 函数时我的导航栏 render() 都会被调用,并且由于某种原因,jasny-bootstrap 导航栏出现错误并在每个 render() 上克隆自身,这会导致延迟. (在我先解决这个问题后,我将不得不调查一下)

您的回复似乎没有 id attribute,而是 _id 属性。

要么你应该发送它是 id,要么你应该通知 backbone 使用 _id 来使用 idAttribute 选项跟踪模型。

官方文档中的例子也有一个_id

var Meal = Backbone.Model.extend({
  idAttribute: "_id"
});