Comment puis-je mettre correctement en œuvre d'analyser dans une base de modèle aux collections?
J'ai un squelette appelé modèle Member
- il contient de l'adhésion des données telles que nom, prénom, e-mail, téléphone, etc. Il comprend également plusieurs valeurs de champs que j'ai besoin de garder comme des collections - ces sont Degrees
et Affiliations
.
La question, je suis en cours d'exécution lors de l'appel de la fetch()
méthode dans mon modèle est qu'il y a une différence d'impédance de toutes sortes entre une base de tableau, et les objets de collection que j'ai dans mon modèle. Depuis parse
, par définition, est censé renvoyer un hachage pour être utilisé dans set
plutôt que de réellement les valeurs de réglage, il est impossible pour moi de mettre mes collections de cette façon. Par exemple - si je retourne un objet JavaScript pour Degrees
qui ressemble à quelque chose comme: {degrees: [{id: 1, title: "PhD"}]}
, alors cette fonction convertit mon degree
collection dans un tableau plat. Voici mon code:
window.Models.Member = Backbone.Model.extend({
url: '/api/member',
initialize: function() {
_.bindAll(this);
this.set('degrees', new window.Collections.DegreesList());
this.fetch();
},
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
//When this is run, this.get('degrees') will now return a flat array rather than a DegreesList collection
setHash.degrees = _(response.degrees).each(function(item) {
return {id: item.id, title: item.title}
});
return setHash;
}
});
Je pourrais définir manuellement les collections dans ma fonction d'analyse, mais qui semble comme sa subversion de l'épine Dorsale façon, et hacky.
EDIT: j'ai temporairement résolu le problème en procédant comme suit:
parse: function(response) {
var setHash = {};
setHash.first_name = response.first_name;
setHash.last_name = response.last_name;
setHash.office_phone = response.office_phone;
this.get('degrees').reset( response.degrees );
return setHash;
}
Je doute que cela soit la solution optimale, mais cela ne fonctionne pour l'instant. Je suis ouvert à de meilleures suggestions.
parse:
fonction (il ne semble pas être nécessaire), et la place à l'intérieur de initialize:
manuellement transformer le degrees
attribut à partir d'un tableau à l'épine Dorsale de la collection...parse
est appelée automatiquement une fois que le fetch
méthode retourne. J'ai pu réinitialiser manuellement le degrees
attribut à une collection après fetch
est appelé, mais alors je n'aurais pas toutes les données dans cette collection que je veux...et les données sont à venir dans.Que vous avez à faire beaucoup de chose avec
degrees
si vous ajoutez manuellement dans le parse
. Aller avec @ŠimeVidas suggestion et de l'utilisation d'un Backbone de collecte pour eux. Cela vous permet de traiter chaque degree
l'épine Dorsale.
OriginalL'auteur rybosome | 2012-02-29
Vous devez vous connecter pour publier un commentaire.
J'utilise exactement la même solution que vous proposez, sauf avec quelques modifications.
degreesData
initialize
j'ai créer la collection comme ceci:this.degrees = new Degrees().reset( this.get( "degreesData" ) );
ce que je remplir dans l'initialisation est la
degrees
Collection pas de ladegreesData
attribut. LedegreesData
attribut est fourni dans le cadre de la première JSON est utilisé pour initialiser le Modèle, si cette info est disponible dans leinitialize()
. (Si je me souviens correctement)De creuser ce nouveau, de ce que si vous devez initialiser un modèle vide? Vous allez devoir commencer à coder les valeurs par défaut et d'autres choses. Peut-être analyser est une meilleure option, au moins vous êtes (presque) garantie de disposer de données à ce point.
OriginalL'auteur fguillen