37 votes

Extension des valeurs par défaut d'une super classe de modèles dans Backbone.js

J'aimerais poser comme question à cette réponse, mais je n'arrive pas à le faire, je m'en excuse.

L'extension par défaut pour le sous-classe sont reflétées dans la superclasse. Ce qui semble à l'encontre du but et je suis plus apte à la liste explicite de la super-classe de " valeurs par défaut dans le sous-classe pour obtenir la structure, je suis à la recherche pour.

var Inventory = Backbone.Model.extend({
    defaults: {
        cat: 3,
        dog: 5
    }
});

var ExtendedInventory = Inventory.extend({
});

_.extend(ExtendedInventory.prototype.defaults, {rabbit: 25});

var i = new Inventory();
var ei = new ExtendedInventory();
console.log(i.attributes);
console.log(ei.attributes);

Ce sorties:

{cat: 3, dog: 5, rabbit: 25}
{cat: 3, dog: 5, rabbit: 25}

Pas ce que j'ai (ni, je suppose, l' op) voulez:

{cat: 3, dog: 5}
{cat: 3, dog: 5, rabbit: 25}

50voto

JCorcuera Points 3632

Le problème est que Inventory.prototype.defaults et Extended.prototype.defaults ont la même référence, car vous n'avez pas remplacé la référence.

Donc vous pouvez le faire de 2 manières, peut-être plus mais je n'ai trouvé que 2:

Edit: le premier exemple est incorrect (voir les commentaires); s'il vous plaît se référer à la seconde.

 var ExtendedInventory = Inventory.extend({
    defaults: {
        rabit:25
    }
});

_.extend(ExtendedInventory.prototype.defaults, Inventory.prototype.defaults);
 

ou

 var ExtendedInventory = Inventory.extend({
    defaults: _.extend({},Inventory.prototype.defaults,
         {rabit:25}
    )
});
 

Je pense que le premier a l'air plus propre.

18voto

b73 Points 310

Je pense que la meilleure façon de le résoudre est d'utiliser la méthode _.defaults de underscore.js. Cela vous permettra de remplacer les valeurs par défaut dans votre sous-classe Model:

 _.defaults(ExtendedInventory.prototype.defaults, 
           Inventory.prototype.defaults);
 

Voir cet exemple:

http://jsfiddle.net/mattfreer/xLK5D/

3voto

ErichBSchulz Points 1058

En tant qu'extension de la réponse de JCorcuera, si votre classe de base utilise (ou peut utiliser) une fonction pour définir les valeurs par défaut, cela fonctionnera parfaitement:

    defaults: function() {                                     
     return _.extend( _.result(Slot.prototype, 'defaults'),{  
       kind_id: 6,                                  
       otherthing: 'yello'  
       // add in your extended defaults here                                
   })}                                                      
 

le bit clé étant l'utilisation d'une fonction dans la méthode des valeurs par défaut de l'enfant et _.result() docs

0voto

c3rin Points 1637

Je pense que vous avez raison, vous voulez vous assurer que cet Inventaire.le prototype.les valeurs par défaut ne change pas en raison de l'ajout de lapin à la ExtendedInventory.les valeurs par défaut. Mon protoypical l'héritage n'est pas assez bon pour expliquer clairement pourquoi la ci-dessous fonctionne, mais je pense que cela ne ce que vous voulez qu'il fasse.

ExtendedInventory.defaults = {}
_.extend(ExtendedInventory.defaults, ExtendedInventory.prototype.defaults, {rabbit: 25});

Un point important à retenir à propos de l' _.étendre la méthode est que le premier argument est - destination. Il prend tous les attributs de la arguments après le premier argument et les place dans l'argument de destination.

Un autre point est que ExtendedInventory.le prototype.par défaut === Inventaire.le prototype.les valeurs par défaut des résultats dans true, ce qui signifie qu'ils sont le même objet, donc si vous changez le prototype de ExtendedInventory vous modifier le prototype de l'Inventaire (je ne suis pas sûr pourquoi ils sont égaux si, en premier lieu).

0voto

Oleksandr Knyga Points 101
var MoveToolModel = ToolModel.extend({
    extendDefaults: {
        cursor: 'move'
    },
    initialize: function() {
        ToolModel.prototype.initialize.apply(this, arguments);
        this.defaults = _.extend({}, this.defaults, this.extendDefaults);
    },
    draw: function(canvasContext, data) {
        //drag
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X