Backbone.js: écraser toJSON

J'essaie de mettre en œuvre une sorte de collection imbriquée dans un Backbone.Model

Pour ce faire, je dois écraser les fonctions de l'adaptateur qui analysent la réponse du serveur et enveloppent le tableau dans une collection et la fonction qui sérialise l'objet entier sans aucune méthode d'aide. J'ai le problème avec le second.

var Model = Backbone.Model.extend({ urlRoot: "/model", idAttribute: "_id", // this wraps the arrays in the server response into a backbone collection parse: function(resp, xhr) { $.each(resp, function(key, value) { if (_.isArray(value)) { resp[key] = new Backbone.Collection(value); } }); return resp; }, // serializes the data without any helper methods toJSON: function() { // clone all attributes var attributes = _.clone(this.attributes); // go through each attribute $.each(attributes, function(key, value) { // check if we have some nested object with a toJSON method if (_.has(value, 'toJSON')) { // execute toJSON and overwrite the value in attributes attributes[key] = value.toJSON(); } }); return attributes; } }); 

Le problème est maintenant à la deuxième partie dans le JSON. Pour certaines raisons

 _.has(value, 'toJSON') !== true 

Ne retourne pas vrai

Quelqu'un pourrait-il me dire ce qui ne va pas?

Le soulignement has fait ceci:

A _.has(object, key)

L'objet contient-il la clé donnée? Identique à object.hasOwnProperty(key) , mais utilise une référence sécurisée à la fonction hasOwnProperty , au cas où elle aurait été remplacée accidentellement.

Mais votre value n'aura pas de propriété toJSON puisque toJSON provient du prototype (voir http://jsfiddle.net/ambiguous/x6577/ ).

Vous devez utiliser _(value.toJSON).isFunction() place:

 if(_(value.toJSON).isFunction()) { // execute toJSON and overwrite the value in attributes attributes[key] = value.toJSON(); }