105 votes

Backbone.js obtenir et définir l’attribut de l’objet imbriqué

Niveau d'expérience: débutant

J'ai une simple question à propos de Backbone.js' obtenir et de définir les fonctions.

1) Avec le code ci-dessous, comment 'get' ou 'set' obj1.myAttribute1 directement?

Une autre question:

2) Dans le Modèle, à part les valeurs par défaut de l'objet, où peux/dois-je déclarer mon modèle d'autres attributs, tels qu'ils peuvent être accessibles via l'épine Dorsale de l'méthodes get et set?

var MyModel = Backbone.Model.extend({
    defaults: {
        obj1 : {
            "myAttribute1" : false,
            "myAttribute2" : true,
        }
    }
})

var MyView = Backbone.View.extend({
    myFunc: function(){
        console.log(this.model.get("obj1"));
        //returns the obj1 object
        //but how do I get obj1.myAttribute1 directly so that it returns false?
    }
});

Je sais que je peux faire:

this.model.get("obj1").myAttribute1;

mais est-ce une bonne pratique?

Apprécier tous les aider.

144voto

Domenic Points 40761

Alors qu' this.model.get("obj1").myAttribute1 est bien, c'est un peu problématique parce que vous pourriez être tenté de faire la même chose pour le jeu, c'est à dire

this.model.get("obj1").myAttribute1 = true;

Mais si vous faites cela, vous ne serez pas obtenir les avantages de l'épine Dorsale des modèles pour myAttribute1, comme les événements de modification ou de la validation.

Une meilleure solution serait de ne jamais nest POJSOs ("la plaine de vieux objets JavaScript") dans vos modèles, et à la place du nid modèle de classes. Donc, il devrait ressembler à quelque chose comme ceci:

var Obj = Backbone.Model.extend({
    defaults: {
        myAttribute1: false,
        myAttribute2: true
    }
});

var MyModel = Backbone.Model.extend({
    initialize: function () {
        this.set("obj1", new Obj());
    }
});

Ensuite, l'accès à code serait

var x = this.model.get("obj1").get("myAttribute1");

mais le plus important est le paramètre de code serait

this.model.get("obj1").set({ myAttribute1: true });

qui va déclencher des changements appropriés événements et la comme. Exemple ici: http://jsfiddle.net/g3U7j/

74voto

evilcelery Points 7371

J’ai créé l’épine dorsale-deep-modèle pour cela - étendre seulement Backbone.DeepModel au lieu de Backbone.Model et vous pouvez ensuite utiliser des chemins d’accès pour obtenir/définir des attributs des modèles imbriqués. Il maintient les événements de modification de trop.

16voto

Rusty Points 156

Solution de Domenic fonctionnera toutefois chaque nouveau MyModel pointera vers la même instance d’obj. Pour éviter cela, MyModel devrait ressembler à :

Voir la réponse de c3rin @ http://stackoverflow.com/a/6364480/1072653 pour une explication complète.

5voto

J’utilise cette approche.

Si vous avez un modèle de colonne vertébrale comme ceci :

Vous pouvez définir l’attribut « a.b » avec :

Maintenant votre modèle aura des attributs tels que :

l’événement de « changement » tirèrent.

2voto

Cory Gagliardi Points 523

J’ai eu le même problème @pagewil et @Benno eu avec solution de @Domenic. Ma réponse était plutôt écrire une simple sous-catégorie de Backbone.Model qui résout le problème.

Que NestedModel fait pour vous, c’est permettre à ceux-ci de travailler (qui est ce qui arrive lorsque myModel obtient la valeur par l’intermédiaire de données JSON) :

Il serait facile de générer automatiquement de la liste des modèles d’initialisation, mais cette solution a été assez bonne pour moi.

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