2016-03-31 16 views
0

私はいくつかのビューに渡す 'ビジネス'コレクションを持っています。バックボーンフェッチは毎回同じモデルを削除して読み込みます

私はthis.business.fetch()を実行するとき、返されるモデルはまったく同じですが、コレクションは返されたモデルが新しいと考えるので 'add'と 'remove' 「新しい」モデルを追加します。私がモデルの間に見ることができる唯一の違いはcidです。

フェッチでコレクションが変更されたと思われるのはなぜですか?それがないにもかかわらず?

これは私のコードです:

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; 
} 

私はアイテムと呼ばれる別のコレクションを持って、それは完全にフェッチします。しかし、いくつかの理由で、私は最初の取出しにbusiness.fetch()を実行すると、それは2つの企業が19 & 20をCID追加し、その後、フェッチ第二に、それは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 : "[email protected]" 
hasLogo : false 
name : "afsaf" 
phone : "" 
postcode : "2131" 
reservationlist : Array[1] 
settingsSchema : Array[1] 
staff : Array[1] 
street : "123132" 
suburb : "1231321" 
waitlist : Array[1] 

これは、onBusinessAdd関数が呼び出されるたびに何らかの理由でnavbar render()が呼び出され、遅延を引き起こすすべてのrender()でjasny-bootstrap navbarのバグがクローズされるため、問題を引き起こします。

+0

それは、これはアイデンティティの問題であるように私には見えます。モデルは同じだと思うが、バックボーンはそうではない。バックボーンは、同一性(アイデンティティ)をidで決定します。フェッチされたモデルに 'id'プロパティがあることを保証する必要があります。 – 76484

+0

私を正しい道に導いてくれてありがとう!しかし、T Jが言及したように。特にidプロパティを持つ必要はありません。あなたはidAttributeに '_id'を設定することができます – Ta946

答えて

0

あなたの応答はid attributeではないようですが、代わりに_idプロパティがあります。

idを送信するか、idAttributeオプションを使用してモデルを追跡するために_idを使用するようバックボーンに通知する必要があります。公式ドキュメントで

例は、同様に_idがあります

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

私は最初idAttributeを使って問題が発生しました: "_id"これは私の他のルータ呼び出しの1つと思われるためです:new BusinessModel({id:id}); 私は{_id:id} – Ta946

関連する問題