webentwicklung-frage-antwort-db.com.de

Prüfen Sie, ob etwas ein Modell oder eine Sammlung in Backbone-js ist

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!

27
neph

Sie könnten instanceof auch so versuchen:

Backbone.sync = function(method, model, options) {
  if (model instanceof Backbone.Model) {
    ...
  } else if (model instanceof Backbone.Collection) {
    ...
  }
}
56
fiskers7

@ 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
10
Nicolas Zozol

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.

2
robrich

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

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"){}
0
Exploit