Ich habe eine 'Business' Sammlung, die ich zu verschiedenen Ansichten übergeben.Backbone Fetch entfernt und liest die gleichen Modelle jedes Mal
Wenn ich this.business.fetch() ausführen, sind die zurückgegebenen Modelle genau gleich, aber die Ereignisse 'add' und 'remove' werden ausgelöst, weil die Sammlung denkt, dass die zurückgegebenen Modelle neu sind. und fügt die "neuen" Modelle hinzu. Der einzige Unterschied, den ich zwischen den Modellen sehen kann, ist die CID.
Warum denkt der Abruf, dass sich die Sammlung geändert hat? obwohl es nicht ist?
Dies ist mein Code:
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;
}
.
Ich habe eine andere Sammlung namens Artikel, und das holt sich perfekt. Aber aus irgendeinem Grund, wenn ich business.fetch() auf den ersten fetch ausführen, fügt es 2 Unternehmen cid 19 & 20, dann auf den zweiten Abruf, löscht es cid 19 & 20 und fügt cid 23 & 24, obwohl sie die sind
gleicheich die folgende in meiner Konsole:
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…}
. Die Attribute von "C19" == "C23" und "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]
.
.
Dies verursacht ein Problem für mich, wie meine Navbar render() jedes Mal aufgerufen wird, wenn die onBusinessAdd Funktion aufgerufen wird und aus irgendeinem Grund die Jasny-Bootstrap Navbar Bugs aus und klont sich auf jedem render() was Lag verursacht. (Ich werde das überprüfen müssen, nachdem ich dieses Problem zuerst behoben habe)
Es sieht für mich, dass dies ein Problem der Identität ist. Du denkst, die Modelle sind die gleichen, aber Backbone nicht. Backbone bestimmt die Identität (Identität) durch ID. Sie müssen sicherstellen, dass die abgerufenen Modelle die Eigenschaft 'id' haben. – 76484
danke für die Führung auf dem richtigen Weg! Aber wie T J erwähnt. Sie müssen nicht unbedingt eine ID-Eigenschaft haben. Sie können IDAttribute nur auf '_id' setzen – Ta946