web-dev-qa-db-fra.com

Vérifiez si quelque chose est un modèle ou une collection dans le backbone js

Lorsque vous substituez la synchronisation de backbone, les deux modèles/collection .save ()/fetch () utilisent la même méthode de synchronisation de backbone. Quel est le meilleur moyen de vérifier si Backbone.sync reçoit est un modèle ou une collection de modèles?

Par exemple:

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
}

Je suppose que je recherche une meilleure pratique "sûre", je pourrais bien sûr vérifier certains attributs ou méthodes que seul un modèle ou une collection possède, mais cela semble être un fiasco, ne devrait-il pas y avoir un meilleur moyen évident? Et il y a probablement je ne pouvais pas le trouver.

Merci!

27
neph

Vous pouvez aussi essayer instanceof comme ceci:

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

La réponse de @ fiskers7 fonctionne avec une extension profonde:

        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

C'est tout aussi hack, mais une collection Backbone a une propriété de modèle, et un modèle n'en a pas - c'est en soi un modèle.

Model.toJSON () est peut-être une méthode plus sûre et permet de voir si le résultat est un objet ou un tableau. De toute façon, vous allez probablement model.toJSON () dans votre Backbone.sync personnalisé, donc bien que cela soit assez coûteux en calcul, cela arriverait quand même.

2
robrich

Je ne suis pas tout à fait sûr de ce que je ressens à ce sujet parce que cela semble un peu ridicule, mais je ne peux pas vraiment savoir pourquoi ce serait si grave en ce moment.

C'est tout à fait simple et plus rapide qu'une vérification "instanceof" (je suppose que vous ne nommerez aucune autre fonction "isBBModel/Collection" sur vos objets?)

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

Vous pouvez faire quelque chose comme ça.

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

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

if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}
0
Exploit