web-dev-qa-db-fra.com

Remplacez le nordbone.Sync () au niveau du modèle pour envoyer des paramètres supplémentaires?

Être tout à fait honnête, je suis bloqué en essayant de remplacer la méthode de synchronisation de Backbone () pour un modèle, j'ai la signature de la fonction en place et qu'elle est déclenchée correctement, mais Je ne sais pas quoi mettre en place Le corps de la fonction Pour qu'il effectue un appel par défaut à supprimer mais avec des arguments supplémentaires. c'est à dire.

class Master.Models.Member extends Backbone.Model
  urlRoot: '/api/members/'

  sync: (method, model, options) ->
    params = _.clone options
    Backbone.sync method, model, params

J'appelle ça comme ça:

......
remove: ->
  @model.destroy
    collective_id: the_id

Mon intention là-bas est de passer le Collective_id Param que vous voyez sur le serveur. Mais même si c'est à l'intérieur du hachage d'options pour synchronisation () et je le clonage , il ne se rendra pas au serveur! Comment puis-je envoyer ce paramètre supplémentaire sur le serveur?

(Comme c'est le cas, la seule chose qui atteint le serveur est l'ID du modèle)

Merci d'avance!

24
jlstr

Lorsque vous appelez .Destroy (), .fetch () ou .save () Ils appellent tous modèle.sync qui appelle uniquement sworkbone.sync. C'est une fonction proxy. Ceci est destiné à fournir un joli crochet pour modifier le AJAX Comportement d'un modèle unique ou de tout modèles qui s'étendent à partir de ce modèle.

  • SOLUTION 1: remplace le goldbone global.sync à JSON.stringify Et modifiez le contentType lorsque vous avez spécifié des données à envoyer avec la demande de suppression.
    • Avantages: Vous pouvez appeler model.destroy() et éventuellement passer dans un paramètre options
  • Solution 2 - remplacer la méthode Model.Sync. [.____]
    • Avantages: le remplacement n'affecte que des modèles individuels. Changements isolés.
    • Inconvénients: Tous les modèles qui souhaitent supprimer avec les données doivent s'étendre à partir du bon "modèle de base" correct
  • Solution 3 - Ne remplacez rien et appelez explicitement modèle.sync avec tous les éléments stringify et contentType. [.____]
    • Avantages: changements très isolés, n'affectera aucun autre modèle. Utile si vous vous intégrez avec une grande base de code.

[[[solution 1] - Remplacement global de Backbone.Sync (cela affectera tous les modèles)

Version JavacRipPT

var oldBackboneSync = Backbone.sync;
Backbone.sync = function( method, model, options ) {
    // delete request WITH data
    if ( method === 'delete' && options.data ) {
        options.data = JSON.stringify(options.data);
        options.contentType = 'application/json';
    } // else, business as usual.
    return oldBackboneSync.apply(this, [method, model, options]);
}

Utilisation:

var model, SomeModel = Backbone.Model.extend({ /* urlRoot, initialize, etc... */});
model = new SomeModel();
model.destroy({
    data: {
        /* data payload to send with delete request */
    }
});

[[Solution 2] - PROCHE ROWNBONE.DESTROY SUR UN MODÈLE DE BASE ET ÉTENDURE D'AUTRES MODÈLES À partir de cela.

Remplacer

// Create your own 'enhanced' model 
Backbone.EnhancedModel = Backbone.Model.extend({
    destroy: function( options ) {
        if ( options.data ) {
            // properly formats data for back-end to parse
            options.data = JSON.stringify(options.data);
        }
        // transform all delete requests to application/json
        options.contentType = 'application/json';
        Backbone.Model.prototype.destroy.call(this, options);
    }
});

Utilisation

var model, SomeModel = Backbone.EnhancedModel.extend({ /* urlRoot, initialize, etc... */})
model = new SomeModel();
SomeModel.destroy({
    data: {
        /* additional data payload */
    }
}); 

[Solution 3] - Appelez .Destroy () avec des paramètres corrects.

Si l'envoi de données avec vos demandes de détruire est une chose isolée, c'est une solution adéquate.

Lorsque vous appelez model.destroy() Passez dans les options data et contentType comme:

Version/utilisation JavaScript

var additionalData = { collective_id: 14 };
model.destroy({
    data: JSON.stringify(additionalData),
    contentType: 'application/json'
});

Le "problème" (avec une colonne vertébrale, pas des solutions):

Backbone.js fait l'hypothèse ( View Source ) qui supprimer les demandes ne Avoir une charge utile de données.

// delete methods are excluded from having their data processed and contentType altered.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
      params.contentType = 'application/json';
      params.data = JSON.stringify(options.attrs || model.toJSON(options));
}

Dans leur appel de l'API reposant supposé, les seules données requises sont l'ID qui devrait être annexé à une propriété urlRoot.

var BookModel = Backbone.Model.extend({
    urlRoot: 'api/book'
});
var book1 = new BookModel({ id: 1 });
book1.destroy()

La demande de suppression serait envoyée comme

DELETE => api/book/1
contentType: Content-Type:application/x-www-form-urlencoded; charset=UTF-8
44
Cory Danielson

Les paramètres doivent être envoyés dans options.data, alors essayez:

cafetière

remove: () ->
  @model.destroy 
    data: JSON.stringify
      collective_id: the_id, 
    contentType: 'application/json'

javascript

remove: function() {
  return this.model.destroy({
    data: JSON.stringify({
      collective_id: the_id
    }),
    contentType: 'application/json'
  });
}
4
glortho