“Comment” pour enregistrer l'intégralité de la collection en Backbone.js - Dorsale.sync ou jQuery.ajax?
Je suis bien conscient qu'il peut être fait et j'ai regardé un peu partout (y compris: Les meilleures pratiques pour la sauvegarde d'un ensemble de la collection?). Mais je ne suis toujours pas clair "exactement comment" est-il écrit dans le code? (le post, il explique en anglais. Ce serait génial d'avoir un javascript spécifique explication 🙂
Dire que j'ai une collection de modèles - les modèles eux-mêmes peuvent avoir les collections imbriquées. J'ai remplacé la méthode toJSON() de la collection parent et j'en suis JSON valide de l'objet. Je souhaite à "sauver" l'ensemble de la collection (correspondant JSON), mais épine dorsale ne semblent pas venir dans-construit avec cette fonctionnalité.
var MyCollection = Backbone.Collection.extend({
model:MyModel,
//something to save?
save: function() {
//what to write here?
}
});
Je sais quelque chose que vous avez à dire:
Backbone.sync = function(method, model, options){
/*
* What goes in here?? If at all anything needs to be done?
* Where to declare this in the program? And how is it called?
*/
}
Une fois que l'affichage se fait avec le traitement, il est responsable de raconter de la collection "enregistrer" sur le serveur (capable de gérer un volume de mise à jour/créer de la demande).
Questions qui se posent:
- Comment/quoi écrire dans le code de fil "tous ensemble"?
- Qu'est-ce que le "droit" de l'emplacement des rappels et de la façon de spécifier un "succès/erreur" de rappel? Je veux dire du point de vue syntaxique?Je ne suis pas sûr de la syntaxe de l'enregistrement des rappels de la colonne vertébrale...
Si c'est en effet un délicat travail alors que l'on peut appeler jQuery.ajax dans une vue et de passer le this.successMethod
ou this.errorMethod
que de succès ou d'erreur de rappels?? Ça va fonctionner?
J'ai besoin d'obtenir la synchronisation avec l'épine dorsale de la façon de penser, je sais que je ne suis certainement raté quelque chose.w.r.t., la synchronisation de l'ensemble des collections.
- Votre code côté serveur prendre cela comme une seule demande? En d'autres termes, l'ensemble de haut niveau de la collecte, tous les modèles, et les collections imbriquées comme un seul JSON paquet? Ou, avez-vous besoin d'enregistrer chaque modèle individuellement? Edit: Ah, lire de plus près, le serveur EST capable de "vrac création/mise à jour"
- Yup! Avait fait explicite, car, en général, d'un point de préoccupation, mais pas dans ce cas 🙂
- Alors, quelle est la structure de données que le serveur s'attend à recevoir?
- La structure de la matière de données? Le formatage n'est pas possible dans un commentaire, mais c'est comme ça: [{postId: 1, les étiquettes:[{id:1,nom:"a"},{id:2,nom:"b"}]}] Fondamentalement, chaque "postId" peut avoir un jeu/tableau de labels qui sont eux-mêmes des objets. Il peut y avoir beaucoup de ces messages...je ne pense pas que le format de données a eu quelque chose à voir avec la question à portée de main, à moins que je me manque quelque chose
- Voir aussi stackoverflow.com/questions/7975316/...
Vous devez vous connecter pour publier un commentaire.
Ma pensée n'est pas à remplacer la méthode sur la méthode d'enregistrement sur la colonne vertébrale.Collection d'envelopper la collection dans un autre de la colonne vertébrale.Modèle et remplacer la méthode toJSON sur que. Alors Backbone.js permettra de traiter le modèle d'une seule ressource et vous n'avez pas de pirater le chemin backone pense trop.
Notez que la colonne vertébrale.La Collection a une méthode toJSON de sorte que la plupart de votre travail est fait pour vous. Vous avez juste à le proxy de la méthode toJSON de votre enveloppe de la colonne vertébrale.Modèle de la colonne vertébrale.collection.
getURL(model)
sur le modèle de l'argumentation et de ne pas effectuer les typeof comparaisons soit...semble être intentionnelle par la conceptionTrès simple...
...donnera à vos collections un enregistrement de la méthode. Gardez à l'esprit cette volonté de toujours publier l'ensemble de la collection de modèles pour le serveur, indépendamment de ce qui a changé. les options sont tout à fait normale, ajax jQuery options.
return Backbone.sync..
est plus Backbonish.J'ai fini par avoir un "enregistrer" comme méthode et appelé $.ajax en son sein. Il m'a donné plus de contrôle sur elle sans la nécessité d'ajouter une classe wrapper comme @brandgonesurfing suggéré (bien que j'adore l'idée 🙂 Comme mentionnés dans la mesure où j'ai déjà eu de la collection.méthode toJSON() redéfinie tous j'ai atterri à faire était de l'utiliser dans l'appel ajax...
Espère que cela aide quelqu'un qui tombe sur elle...
Cela dépend vraiment de ce que le contrat est conclu entre le client et le serveur. Voici une procédure simplifiée CoffeeScript exemple où une mise à
/parent/:parent_id/children
avec{"children":[{child1},{child2}]}
remplacera l'un des parents des enfants avec ce qui est dans la vente et le retour{"children":[{child1},{child2}]}
:C'est un exemple assez simple, vous pouvez faire beaucoup plus... ça dépend vraiment de ce que l'état de vos données lorsque save() est exécutée, dans quel état elle doit être en afin de l'envoyer au serveur, et le serveur donne en retour.
Si votre serveur est ok avec un METTRE de
[{child1},{child2]
, votre colonne vertébrale.synchronisation de ligne pourrait changer àresponse = Backbone.sync('update', @toJSON(), url: @url(), contentType: 'application/json')
.La réponse dépend de ce que vous voulez faire avec la collection sur le côté serveur.
Si vous devez envoyer des données supplémentaires avec le poste que vous pourriez avoir besoin d'un wrapper modèle ou un modèle relationnel.
Avec le wrapper modèle vous devez toujours écrire votre propre analyser méthode:
Modèles relationnels sont mieux, je pense, parce que vous pouvez configurer plus facilement et vous pouvez régler avec le includeInJSON option attributs à mettre dans le json que vous envoyez à votre service rest.
Si vous n'envoyez pas de données supplémentaires, vous pouvez de synchronisation de la collection elle-même. Vous devez ajouter un enregistrer méthode à votre collection (ou la collection prototype) dans ce cas:
J'ai été aussi surpris que l'épine Dorsale des collections n'ont pas construit dans l'enregistrer. Voici ce que j'ai mis sur mon épine dorsale de la collection de le faire. Je ne voulez certainement pas pour itérer sur chaque modèle de la collection et de les enregistrer de façon indépendante. Aussi, je suis à l'aide de la Dorsale sur le backend l'aide d'un Noeud suis overridding le natif
Backbone.sync
pour enregistrer dans un fichier à plat sur mon petit projet, mais le code doit à peu près le même:save: function (options) { Backbone.sync('save', this, options); }
Vieux thread, je sais, ce que j'ai fait est le suivant:
Assez straint avant-propos 🙂
Voici un exemple simple:
Lorsque vous appelez la méthode save() sur votre collection, il va envoyer une méthode de requête à l'URL définie.
Je voudrais essayer quelque chose comme:
( https://stackoverflow.com/a/11085198/137067 )
Accepté la réponse est assez bon, mais je peux aller plus loin et vous donner le code qui s'assure de la bonne événements sont déclenchés pour vos auditeurs tout en vous permettant de passer en option ajax rappels d'événement:
Pour toute personne qui est encore à l'aide de backbone.js en 2017, a accepté de répondre n'est pas de travail.
Essayez de retirer la méthode toJSON() remplacer dans le wrapper modèle et de l'appel de la méthode toJSON sur la collection lors de l'instanciation du modèle wrapper.