Wenn Sie die Backbone-Synchronisierung überschreiben, verwenden beide .save ()/fetch () - Methoden/Sammlungen dieselbe Backbone-Synchronisationsmethode. Wie können Sie also am besten prüfen, ob Backbone.sync ein Modell oder eine Sammlung von Modellen ist?
Als Beispiel:
Backbone.sync = function(method, model, options){
//Model here can be both a collection or a single model so
if(model.isModel()) // there is no isModel or isCollection method
}
Ich nehme an, ich suche nach einer "sicheren" bewährten Methode. Ich könnte natürlich nach bestimmten Attributen oder Methoden suchen, die nur ein Modell oder eine Sammlung hat, aber es scheint hackig zu sein, sollte es nicht einen besseren Weg geben? Und da ist es wahrscheinlich, dass ich es einfach nicht finden konnte.
Vielen Dank!
Sie könnten instanceof
auch so versuchen:
Backbone.sync = function(method, model, options) {
if (model instanceof Backbone.Model) {
...
} else if (model instanceof Backbone.Collection) {
...
}
}
@ fiskers7s Antwort funktioniert mit tiefer Erweiterung:
var Item = Backbone.Model.extend({
className : 'Item',
size :10
});
var VerySmallItem = Item.extend({
size :0.1
});
var item = new Item();
var verySmall = new VerySmallItem();
alert("item is Model ?" + (item instanceof Backbone.Model)); //true
alert("verySmall is Model ?" + (verySmall instanceof Backbone.Model)); //true
Dies ist ebenso hackig, aber eine Backbone-Sammlung hat eine Modelleigenschaft und ein Modell nicht - es ist selbst ein Modell.
Vielleicht eine sicherere Methode ist model.toJSON () und ob das Ergebnis ein Objekt oder ein Array ist. Wahrscheinlich werden Sie ohnehin zu model.toJSON () in Ihrer benutzerdefinierten Backbone.sync-Datei wechseln. Obwohl dies recht rechenintensiv ist, könnte es trotzdem passieren.
Ich bin nicht ganz sicher, wie ich mich dabei fühle, weil es ein bisschen hackig erscheint, aber ich kann mir nicht genau vorstellen, warum es momentan so schlimm wäre.
Definitiv einfach und schneller als eine Instanzprüfung (Ich nehme an, Sie nennen keine anderen Funktionen "isBBModel/Collection" für Ihre Objekte?)
Backbone.Model.prototype.isBBCollection = function() { return false; }
Backbone.Model.prototype.isBBModel = function() { return true; }
Backbone.Collection.prototype.isBBCollection = function() { return true; }
Backbone.Collection.prototype.isBBModel = function() { return false; }
Sie könnten so etwas tun.
Backbone.Model.prototype.getType = function() {
return "Model";
}
Backbone.Collection.prototype.getType = function() {
return "Collection";
}
if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}