2012-04-18 10 views
27

Cuando anula la sincronización de backbone, tanto el modelo/colección .save()/fetch() utiliza el mismo método de sincronización de backbone, ¿cuál es la mejor manera de comprobar si lo que Backbone.sync recibe es un modelo o una colección de modelos?Compruebe si algo es un modelo o una colección en backbone js

A modo de ejemplo:

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 
} 

supongo que estoy buscando un lugar "seguro" las mejores prácticas, lo que pude de verificación curso para ciertos atributos o métodos que sólo un modelo o una colección tienen, pero parece hackish, ¿no debería haber una mejor manera obvia? Y probablemente es que simplemente no pude encontrarlo.

Gracias!

Respuesta

56

Se podría también tratar instanceof así:

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

Esto es igualmente hackish, pero una colección Backbone tiene una propiedad modelo, y un modelo no lo tiene: es en sí mismo un modelo.

Quizás un método más seguro sea model.toJSON() y vea si el resultado es un objeto o una matriz. Probablemente va a modelar.toJSON() en su Backbone.sync personalizado de todos modos, así que aunque esto es bastante costoso desde el punto de vista computacional, sucedería de todos modos.

+0

Upvote porque yo era la de la propiedad 'length' (solo Collection ...?!?) ayer en una codificación rápida! Verificar el 'modelo' es brillante en comparación. Jaja. – eightyfive

+3

Ustedes no deberían contar con cosas como esta porque pueden cambiar en el futuro y romper su código. Use la palabra clave instanceof como se describe :) –

0

Podría hacer algo como esto.

Backbone.Model.prototype.getType = function() { 
    return "Model"; 
} 

Backbone.Collection.prototype.getType = function() { 
    return "Collection"; 
} 

if(model.getType() == "Model") {} 
if(model.getType() == "Collection"){} 
+4

Es una muy mala idea, casi imposible de mantener cuando la aplicación se vuelve más complicada. ¿Y qué ocurre si un objeto necesita un método getType() que se refiera a un tipo de automóvil en lugar de un tipo de objeto troncal? –

+0

@NicolasZozol no está de acuerdo. No veo cómo es difícil de mantener y el segundo punto es simplemente injusto. Puede llamar a los métodos anteriores lo que quiera. Por ejemplo 'getBackboneObjectType', que definitivamente no causará ningún conflicto de nombres. –

+0

La razón por la cual esto es malo, es que requiere que el implementador realice un seguimiento de los tipos de objetos contenidos en una biblioteca de terceros, y crea un nuevo prototipo getType cada vez que se introduce un nuevo tipo en futuras versiones de Backbone. Además, se expone a escribir mal los tipos sin una forma realmente fácil de detectarlo (ya que todo se hace mediante comparaciones de cadenas). El uso de instanceof permite que los compiladores de JavaScript (como node.js) detecten cualquier error ortográfico, y fallará la compilación debería objetarse los nombres cambian en una versión actualizada de Backbone, lo que hace que los cambios sean más fáciles de identificar. –

10

@ respuesta de fiskers7 trabaja con extensión profunda:

 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

No estoy del todo seguro de cómo me siento acerca de esto porque parece un poco hackish, pero no puedo pensar exactamente por qué sería súper malo en este momento.

Definitivamente sencillo y más rápido que un "instanceof" cheque (estoy suponiendo que no nombre ninguna otra función "isBBModel/Collection" en sus objetos?)

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