Lors de l'utilisation de backbone.js et du moteur de modèle de compagnon en trait de soulignement, j'ai remarqué que la plupart des exemples appelaient model.ToJSON()
lors du rendu au lieu de passer simplement model
. Je comprends que mon modèle devrait modifier la façon dont il récupère les données.Backbone/Underscore Template - lors du rendu, pourquoi appeler jSON?
Je me demande pourquoi & quel est le bénéfice de toJSON()?
Exemple typique
Dans l'exemple typique model.toJSON()
est appelée lors du rendu. Notez, par souci de brièveté, je mets le modèle dans un littéral de chaîne.
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template('<li><%=ToDoNote%></li>'),
render : function() {
var out= this.template(this.model.toJSON()); //<--JSON
$(this.el).html(out) }
return this;
}
}); //end view
Une Autre méthode
Je creusé dans la colonne vertébrale 0.9.2 & Code Souligner 1.3.3. Dans l'épine dorsale, a remarqué que model.toJSON()
fait ce qui suit: _.clone(this.attributes)
. À l'intérieur du moteur de rendu du modèle, mon modèle compilé nomme les données transmises obj. Après avoir vu ces extraits, j'ai réalisé que le clonage des attributs n'est pas nécessaire. Au lieu de cela, je peux passer directement dans mon modèle (mais avec quelques changements de syntaxe dans le modèle). Quelque chose comme ...
ToDoItemView = Backbone.View.extend({
/* other viewey stuff */
template : _.template('<li><%=obj.get('ToDoNote')%></li>'), //<--notice GET()
render : function() {
var out= this.template(this.model); //<-- look ma no json
$(this.el).html(result) }
return this;
}
}); //end view
En regardant les deux exemples, les seules raisons pour lesquelles je peux trouver pour appeler toJSON sont:
- protéger les données du modèle d'une vue infâmes
- la vue locale modifie les données (pas une bonne idée à mon avis),
- vue a besoin d'accéder à l'aide des valeurs tableau/syntaxe de chaîne (
obj[ namepart + someindex]
)
Ma question se résume à: pourquoi devrais-je appeler toJSON()
et prendre le coup pour cloner les propriétés, plutôt que d'utiliser simplement get() dans mes modèles?
« le coup pour le clonage »? Vous pensez que l'appel 'get' est gratuit? –
@muistooshort - Gratuit? non. 'Get()' ne renvoie pas this.attributes [attr]; '. Ainsi, une recherche de tableau est-elle plus rapide qu'un clone de tableau? Oui - du point de vue des ressources et du temps, mais cela me manque. Appeler 'toJSON()' est clairement intégré dans la pensée collective des communautés de base. Je suis curieux de savoir pourquoi. – EBarr
"Appels de fonction répétés et accès aux objets" par opposition à "un clone et accès répétés aux objets" et je ne vois aucun résultat de référence donc votre * Oui * est simplement opinion (comme toutes les réponses vont être, d'où le "non "vote constructif"). Toutes les vues ne seront pas une cartographie directe d'un modèle ou d'une collection, toJSON est plus flexible et réduit le bruit dans votre modèle. –