Backbone.js Modèle par défaut et analyser
J'ai ce Backbone.Model
représentant d'un des Livres de Google API volume:
var Book = Backbone.Model.extend({
defaults: {
volumeInfo : {
title: 'n.a.',
authors: 'n.a.',
publisher: 'n.a.',
publishedDate: 'n.a.',
imageLinks : {
smallThumbnail: '/unavailable.jpg'
}
}
},
parse: function(resp) {
if (resp.volumeInfo.authors) {
resp.volumeInfo.authors = resp.volumeInfo.authors.join(',');
}
return resp;
}
});
Qui est nourri de ce modèle:
<script type="text/template" id="bookCollectionRow">
<tr>
<td><img class="thumbnail" src="<%= volumeInfo.imageLinks.smallThumbnail %>" /></td>
<td><a target="_blank" href="<%= volumeInfo.canonicalVolumeLink %>"><%= volumeInfo.title %></a></td>
<td><%= volumeInfo.authors %></td>
<td><%= volumeInfo.publisher %></td>
<td><%= volumeInfo.publishedDate %></td>
</tr>
</script>
Sur l'analyse du modèle, lorsqu'un volume JSON ne contient pas de imageLinks
je reçois cette erreur:
Uncaught TypeError: Cannot read property 'smallThumbnail' of undefined.
Je sais que je pourrais le fixer en vérifiant avec un if
dans le Model
ou dans le template
mais quel est le but de defaults
modèle de propriété, alors? Cela fonctionne uniquement si pas primordial parse
?
OriginalL'auteur Andrea Casaccia | 2013-07-21
Vous devez vous connecter pour publier un commentaire.
Un peu les choses. Tout d'abord, vous ne devriez pas avoir des objets imbriqués comme épine dorsale attributs de modèle, en général il peut être OK si vous pouvez toujours traiter l'attribut atomiquement, mais c'est un parfait exemple de quand vous ne pouvez pas. D'un point de vue du modèle, imageLinks devrait être sa propre épine dorsale de la classe du modèle, de même que volumeInfo.
Deuxièmement, si les valeurs par défaut est un objet littéral (
{}
) au lieu d'une fonction, le même objet est utilisé comme valeur par défaut attrs pour chaque instance du modèle. Je pense que vous voulez ce:Mais le modèle de données est le plus gros problème - .par défaut n'est pas le genre de imbriquée-objet-modèle de chose vous semblent aller pour, et pour une bonne raison: il ne fonctionne pas bien, ce sera juste être le premier de beaucoup de pièges que vous rencontrerez si vous ne gardez pas vos données d'instance assez plat.
Je suis encore à essayer d'apprendre épine Dorsale, mais à partir de ce que vous dites, il ne me semble pas une bonne solution pour travailler avec la plupart des webservices :/ Comme à
defaults
comme un objet littéral, j'ai suivi ce tutoriel: backbonetutorials.com/what-is-a-model est-ce qui cloche alors?Sauf que ce n'est pas un sous-objet: c'est lié modèle de l'état ou du comportement, ou de quelque chose - c'est un chose, et il est en charge de vignettes d'url. En essayant de données de carte de procès-verbaux les Api externes dans vos types de données ne semble pas être une bonne idée non plus. En fait, c'est vraiment pourquoi une méthode d'analyse existe de Google de faire des choix concernant la façon de structurer leurs données peuvent ou peuvent ne pas être les mêmes que les vôtres, et si non, l'analyse est là pour faire la conversion. La définition d'un modèle objet arbre qui obtient partiellement fusionnées à partir de données externes est... de bord-cas enclins à dire le moins.
L'exemple de tutoriel utilise javascript natif des littéraux paramètres par défaut: 1 id, nom "Thomas", etc. Dans ce cas, c'est bien de ne pas utiliser une fonction pour les valeurs par défaut. Mais vous avez un conteneur de type que la valeur de l'un de vos paramètres par défaut; vous êtes le partage de la même volumeInfo objet de toutes les instances qui ne l'ont pas dans attrs lorsqu'il est instancié. Nom de partage:"Thomas" n'est pas un problème, parce que vous ne pouvez pas muter "Thomas", ne mettre qu'une nouvelle chaîne. Vous muter volumeInfo['titre'], sans se rendre compte que c'est la même volumeInfo pour toutes les instances qui ne l'a pas mis explicitement.
OriginalL'auteur AdamKG