81 votes

"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 que quelque part 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).

Les Questions qui se posent:

  1. Comment/quoi écrire dans le code de fil "tous ensemble"?
  2. 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 l' this.successMethod ou this.errorMethod réussite/d'erreur 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.

64voto

bradgonesurfing Points 8600

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. 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.

var MyCollectionWrapper = Backbone.Model.extend({
url: "/bulkupload",

//something to save?
toJSON: function() {
    return this.model.toJSON(); // where model is the collection class YOU defined above
 }

});

25voto

hacklikecrack Points 458

Un très simple...

Backbone.Collection.prototype.save = function (options) {
    Backbone.sync("create", this, options);
};

...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.

8voto

PhD Points 3901

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érons que cela aide quelqu'un qui tombe sur elle...

5voto

carpeliam Points 1528

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}]}:

class ChildElementCollection extends Backbone.Collection
  model: Backbone.Model
  initialize: ->
    @bind 'add', (model) -> model.set('parent_id', .id)

  url: -> "#{.url()}/children" # let's say that .url() == '/parent/1'
  save: ->
    response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
    response.done (models) => @reset models.children
    return response

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], alors votre colonne vertébrale.synchronisation de ligne pourrait changer à l' response = Backbone.sync('update', @toJSON(), url: @url(), contentType: 'application/json').

3voto

Mauvis Ledford Points 12424

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(){                                                                                                                                                                                                                                                                                                                                                     
      Backbone.sync('save', this, {                                                                                                                                                                                                                                                                                                                                     
        success: function(){                                                                                                                                                                                                                                                                                                                                          
          console.log('users saved!');                                                                                                                                                                                                                                                                                                                              
        }                                                                                                                                                                                                                                                                                                                                                             
      });                                                                                                                                                                                                                                                                                                                                                               
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X