2012-04-18 1 views
27

Wenn Sie die Backbone-Synchronisierung überschreiben, verwendet sowohl Modell/Sammlung .save()/fetch() die gleiche Backbone-Synchronisierungsmethode Was Backbone.sync erhält, ist ein Modell oder eine Sammlung von Modellen?Überprüfen Sie, ob etwas ein Modell oder eine Sammlung im Backbone ist. Js

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 glaube, ich für einen „sicheren“ best practice suchen, ich natürlich Prüfung für bestimmte Attribute oder Methoden konnte das nur ein Modell oder eine Sammlung, aber es scheint Haschisch, sollte es keinen besseren Weg geben? Und wahrscheinlich konnte ich es einfach nicht finden.

Danke!

Antwort

56

Sie könnten auch instanceof wie so versuchen:

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

Dies ist gleichermaßen hackisch, aber eine Backbone-Sammlung hat eine Modelleigenschaft, und ein Modell nicht - es ist selbst ein Modell.

Vielleicht ist eine sicherere Methode model.toJSON() und sehen, ob das Ergebnis ein Objekt oder ein Array ist. Wahrscheinlich werden Sie in Ihrer benutzerdefinierten Backbone.sync-Datei sowieso model.toJSON() verwenden, obwohl dies ziemlich rechenintensiv ist, würde es trotzdem passieren.

+0

Upvote, weil ich war die Überprüfung auf die 'length'-Eigenschaft (nur Collection ...?!?) gestern in einer schnellen Codierung! Die Überprüfung von 'Modell' ist im Vergleich brillant. Haha. – eightyfive

+3

Sie sollten sich nicht auf solche Dinge verlassen, denn sie könnten sich in Zukunft ändern und Ihren Code durchbrechen. Verwenden Sie das instanceof-Schlüsselwort wie beschrieben :) –

0

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"){} 
+4

Es ist eine sehr schlechte Idee, fast unmöglich zu pflegen, wenn die Anwendung komplizierter wird. Und was passiert, wenn ein Objekt eine getType() -Methode benötigt, die von einem Car-Typ spricht und nicht von einem Backbone-Objekt? –

+0

@NicolasZozol widersprechen. Ich sehe nicht, wie schwer das zu halten ist, und der zweite Punkt ist einfach unfair. Sie können die oben genannten Methoden beliebig aufrufen. Zum Beispiel 'getBackboneObjectType', was definitiv keine Namenskonflikte verursacht. –

+0

Der Grund, warum dies schlecht ist, ist, dass der Implementierer Objekttypen in einer Bibliothek eines Drittanbieters verfolgen muss und einen neuen getType-Prototyp jedes Mal erstellen muss, wenn ein neuer Typ in zukünftigen Versionen von Backbone eingeführt wird. Außerdem setzen Sie sich damit auseinander, dass die Typen falsch geschrieben werden (da dies alles über Zeichenkettenvergleiche geschieht.) Mit instanceof können JavaScript-Compiler (wie node.js) Fehlschreibfehler entdecken und die Kompilierung sollte nicht widerrufen werden Die Namen ändern sich in einer aktualisierten Version von Backbone, wodurch Änderungen leichter zu erkennen sind. –

10

@ Antwort fiskers7 Arbeiten 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 
0

Ich bin nicht ganz sicher, wie ich über dieses Gefühl, weil es scheint ein bisschen hackish, aber ich kann nicht genau darüber nachdenken, warum es im Moment super schlecht wäre.

Definitiv einfach und schneller als ein „instanceof“ Scheck (ich nehme an, Sie werden keine anderen Funktionen „isBBModel/Collection“ auf Ihre Objekte nennen?)

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