Question

Lorsque je récupère des modèles ou des collections sur le serveur, je ne peux pas accéder aux propriétés du modèle à moins de chaîner puis de ré-analyser.Vraisemblablement, les modèles eux-mêmes ont une surcharge supplémentaire de la part de backbone.js ?Notez que dans le code ci-dessous, je peux effectuer une stringify/analyser séquentiellement, ce qui est censé donner le même résultat que celui avec lequel j'ai commencé.Cependant, j'ai clairement éliminé certaines informations superflues en effectuant ces deux étapes car les propriétés de mon modèle sont désormais exposées différemment qu'auparavant.Je n'ai sûrement pas besoin de passer par ces deux étapes pour accéder aux propriétés de mon modèle, n'est-ce pas ?

Eg.  
thismodel = /// assume this came from server fetch
alert(thismodel.name);    // DOES NOT WORK - undefined

jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name);     // WORKS
Était-ce utile?

La solution

Les objets Backbone Model ne sont pas de simples objets JavaScript anciens.Ils conservent leurs attributs un hachage interne.Pour accéder au name attribut, vous pouvez soit faire ceci :

alert(thismodel.attributes.name);

Ou mieux encore, utilisez la méthode get():

alert(thismodel.get("name"));

La raison pour laquelle cela fonctionne lorsque vous convertissez le modèle en JSON, puis inversement, est que JSON.stringify appels la méthode toJSON(), qui crée une chaîne JSON à partir de le hachage des attributs internes, ce qui signifie que lorsque vous analysez cette chaîne, vous obtenez un ancien objet JavaScript simple - qui n'est pas la même chose qu'un objet Backbone Model.

Autres conseils

Tout d’abord, essayez-vous d’accéder à la propriété du modèle ou de la réponse ?

Depuis alert(thismodel.name) il semblerait que vous recherchez une propriété du modèle et non l'attribut.Si vous recherchez l'attribut model, vous voudrez peut-être alert(this.model.get('name'))

Si vous optez effectivement pour model.name, le problème peut résider essentiellement dans la façon dont vous analysez les données.Supposons par exemple que le JSON de votre serveur ressemble à ceci {'name':'Jimmy'}.

Tandis que le model.response le JSON brut envoyé a un espace de noms "Jimmy" sous object.name, Backbone le prendra automatiquement et le transformera en attribut de modèle, sauf indication contraire (par ex.modelObj.attributes.name), auquel cas vous utiliseriez le get() fonction.

Vous devriez pouvoir accéder aux données du modèle assez simplement si tout fonctionne.

Par exemple.Aller chercher

var model = new MyModel();
    model.id = 1;
    model.fetch({
        success: function(model, response) {
            console.log(model.get('name'));  // The model name attribute
            console.log(response.name);  // The RAW response name property
        }
    });

Ou peut-être que votre serveur ne renvoie pas les données sous forme de données JSON.La réponse du serveur est-elle content-type="application/json" ?

Certaines choses à vérifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top