J'ai une question simple sur les fonctions get et set de Backbone.js .
1) Avec le code ci-dessous, comment puis-je 'obtenir' ou 'définir' obj1.myAttribute1 directement?
Une autre question:
2) Dans le modèle, à part l' objet par défaut , où puis-je / dois-je déclarer les autres attributs de mon modèle, de sorte qu'ils soient accessibles via les méthodes get et set de Backbone?
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?
javascript
backbone.js
backbone-model
fortuneRiz
la source
la source
defaults
(obj1 dans ce cas), ce même objet sera partagé entre toutes les instances du modèle. La pratique actuelle consiste à définirdefaults
comme une fonction qui renvoie un objet à utiliser par défaut. backbonejs.org/#Model-defaults (voir la note en italique)Réponses:
Bien que ce
this.model.get("obj1").myAttribute1
soit bien, c'est un peu problématique car alors vous pourriez être tenté de faire le même type de chose pour set, ieMais si vous faites cela, vous n'obtiendrez pas les avantages des modèles Backbone
myAttribute1
, comme les événements de changement ou la validation.Une meilleure solution serait de ne jamais imbriquer des POJSO («simples objets JavaScript anciens») dans vos modèles, mais plutôt d'imbriquer des classes de modèles personnalisées. Cela ressemblerait donc à ceci:
Ensuite, le code d'accès serait
mais plus important encore, le code de réglage serait
qui déclenchera des événements de changement appropriés et autres. Exemple de travail ici: http://jsfiddle.net/g3U7j/
la source
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
, puis commencez à faire des bulles d'événements magiques.J'ai créé backbone-deep-model pour cela - étendez simplement Backbone.DeepModel au lieu de Backbone.Model et vous pouvez ensuite utiliser des chemins pour obtenir / définir des attributs de modèle imbriqués. Il maintient également les événements de changement.
la source
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
La solution de Domenic fonctionnera cependant chaque nouveau MyModel pointera vers la même instance d'Obj. Pour éviter cela, MyModel devrait ressembler à:
Voir la réponse de c3rin @ https://stackoverflow.com/a/6364480/1072653 pour une explication complète.
la source
J'utilise cette approche.
Si vous avez un modèle Backbone comme celui-ci:
Vous pouvez définir l'attribut "ab" avec:
Maintenant, votre modèle aura des attributs comme:
avec l'événement "change" déclenché.
la source
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Cela ne déclenche aucun événement de changement pour moi :(_.clone(m.get('x'))
. mercisetting
avec l'objet que vous êtesgetting
à l'heure définie. Donc, si vous ne clonez pas les deux objets, les deux objets comparés sont exactement les mêmes à l'heure définie.Il y a une solution à laquelle personne n'a encore pensé et qui est très utile. En effet, vous ne pouvez pas définir directement les attributs imbriqués, sauf si vous utilisez une bibliothèque tierce dont vous ne voulez probablement pas. Cependant, ce que vous pouvez faire est de créer un clone du dictionnaire d'origine, d'y définir la propriété imbriquée et de définir l'ensemble de ce dictionnaire. Part de gâteau.
la source
J'ai eu le même problème que @pagewil et @Benno avaient avec la solution de @ Domenic. Ma réponse a été d'écrire à la place une simple sous-classe de Backbone.Model qui résout le problème.
Ce que NestedModel fait pour vous, c'est leur permettre de fonctionner (ce qui se passe lorsque myModel est défini via des données JSON):
Il serait facile de générer automatiquement la liste des modèles lors de l'initialisation, mais cette solution me suffisait.
la source
La solution proposée par Domenic présente quelques inconvénients. Supposons que vous souhaitiez écouter l'événement «changer». Dans ce cas, la méthode 'initialize' ne sera pas déclenchée et votre valeur personnalisée pour l'attribut sera remplacée par l'objet json du serveur. Dans mon projet, j'ai été confronté à ce problème. Ma solution pour remplacer la méthode 'set' de Model:
la source
Bien que dans certains cas, l'utilisation de modèles Backbone au lieu d'attributs d'objets imbriqués ait du sens, comme l'a mentionné Domenic, dans des cas plus simples, vous pouvez créer une fonction de réglage dans le modèle:
la source
Si vous interagissez avec le backend, ce qui nécessite un objet avec une structure d'imbrication. Mais avec backbone plus facile à travailler avec une structure linéaire.
backbone.linear peut vous aider.
la source