Backbone.js get et set imbriquée attribut de l'objet
J'ai une simple question à propos de Backbone.js' obtenir et ensemble fonctions.
1) Avec le code ci-dessous, comment 'get' ou 'set' obj1.myAttribute1 directement?
Une autre question:
2) Dans le Modèle, en dehors de la par défaut 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?
- Alors que ce n'est pas une réponse à la question: à Chaque fois que la spécification d'un objet (tout ce qui est passé par référence) dans
defaults
(obj1 dans ce cas), ce même objet sera partagée entre toutes les instances de ce modèle. La pratique actuelle est de définirdefaults
comme une fonction qui retourne un objet à utiliser comme valeurs par défaut. backbonejs.org/#Model-defaults (voir la note en italique) - Les commentaires ne sont pas faits pour les réponses si vous n'avez jamais besoin de la déclaration 🙂
Vous devez vous connecter pour publier un commentaire.
Tout
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 à direMais 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:
Ensuite l'accès à code serait
mais plus important encore, le paramètre de code serait
qui va déclencher des changements appropriés événements et la comme. Exemple ici: http://jsfiddle.net/g3U7j/
Uncaught TypeError: Object #<Object> has no method 'set'
window.Helper = Backbone.Model.extend({ defaults: { "type": null, "notes": [] } }); window.Events = Backbone.Model.extend({ defaults: { "title": null, "data": new Helper() } } });
(ne fonctionne pas avecmodel.get("data").get("type")
)Backbone.Model
, et ensuite commencer à faire événement magique de bulles.get(...).get is not a function
. À partir du modèle, jeget('attributes')
puisget('attribute')
(Pour le contexte, c'est dans un #groupBy boucle appelée sur un Backbone de collecte, dans lequel le contexte passé est une épine Dorsale modèle de la collection).J'ai créé épine dorsale profonde du modèle pour cela - juste étendre de la colonne vertébrale.DeepModel au lieu de l'épine Dorsale.Modèle et vous pouvez alors utiliser des chemins d'accès pour obtenir/définir imbriqués les attributs de modèle. Il maintient les événements de changement de trop.
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
Domenic est la solution, mais chaque nouvelle Monmodèle va point à la même instance de l'Obj.
Pour éviter cela, Monmodèle devrait ressembler à:
Voir c3rin la réponse de @ https://stackoverflow.com/a/6364480/1072653 pour une explication complète.
- Je utiliser cette approche.
Si vous avez une base de modèle comme ceci:
Vous pouvez définir l'attribut "un.b" avec:
Maintenant votre modèle peut avoir des attributs comme:
avec l'événement "change" tiré.
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Ce n'est pas de déclencher un événement de changement pour moi 🙁_.clone(m.get('x'))
. mercisetting
avec l'objet que vousgetting
à régler l'heure. Donc, si vous n'avez pas de clone, puis les deux objets, puis les deux objets comparés sont exactement la même chose à régler l'heure.Il y a une solution que personne ne pensait encore qui est beaucoup à utiliser. Vous ne pouvez pas définir de imbriqués les attributs directement, sauf si vous utilisez une bibliothèque tierce qui vous ne voulez probablement pas. Cependant, ce que vous pouvez faire est de faire un clone de l'original dictionnaire, définissez la propriété nested là et que l'ensemble de dictionnaire. Morceau de gâteau.
J'ai eu le même problème que @pagewil et @Benno avait avec @Dominique de la solution. Ma réponse a été à la place d'écrire une simple sous-catégorie de la colonne vertébrale.Modèle qui résout le problème.
Ce NestedModel fait pour vous, est de permettre à ces travaux (qui est ce qui se passe quand monmodèle est défini par les données JSON):
Il serait facile de générer la liste des modèles automatiquement dans initialiser, mais cette solution a été assez bon pour moi.
Solution proposée par Dominique a quelques inconvénients. Dites que vous voulez écouter le "changement" de l'événement. Dans ce cas, "initialize" méthode ne sera pas déclenché et personnalisé de votre valeur pour l'attribut, sera remplacé par un objet json à partir du serveur. Dans mon projet, j'ai fait face à ce problème. Ma solution pour remplacer " set " méthode de Modèle:
Alors que, dans certains cas, l'aide d'épine Dorsale des modèles au lieu de imbriqués les attributs de l'Objet a de sens que Dominique mentionné, dans les cas les plus simples, vous pouvez créer une fonction de définition dans le modèle:
Si vous interagissez avec en arrière-plan, ce qui nécessite de l'objet avec l'imbrication de la structure.
Mais avec épine dorsale plus facile de travailler avec la structure linéaire.
de la colonne vertébrale.linéaire peut vous aider.