javascript - Skapa en egen "sync"-metod i Backbone.js


Skapa en anpassad sync()-metod i Backbone.

Jag skulle vilja göra detta på det "rätta" sättet och störa Backbones normala funktioner så lite som möjligt.

Det här är koden som jag har hittills:

var CustomSyncModel = Backbone.Model.extend({
    sync:function(method, model, options){
        var params = {
            type: 'POST'
            url: model.url(),
            error: function(jqXHR, textStatus, errorThrown){
                alert('error');
            },
            success: function(data, textStatus, jqXHR){
                model.parse(data);
            }
        };
        // Got this from line 1359 in Backbone.js developement library
        //     version 0.9.2:
        $.ajax(_.extend(params, options));
    }
 });

Problemet som jag har är att raden: $.ajax(_.extend(params, options)); verkar skriva över de anpassade success och error funktionerna som jag skapade. Men jag är också orolig för att störa några anpassade återuppringningsfunktioner eller annan funktionalitet som kan ha specificerats på annat håll i applikationen som använder denna modell.

Vad är det "korrekta" sättet att gå tillväga för att åsidosätta Backbones sync()-metod?

Tack!

Svar #1

Om du tittar på Model#fetch kommer du att se det vanliga tillvägagångssättet som Backbone använder:

fetch: function(options) {
  //...
  var success = options.success;
  options.success = function(resp, status, xhr) {
    if (!model.set(model.parse(resp, xhr), options)) return false;
    if (success) success(model, resp);
  };
  //...
}

Så Backbone ersätter bara funktionen med en ny som anropar den ursprungliga. I ditt fall skulle du ha något som detta:

// We don't own options so we shouldn't modify it,
// but we can do whatever we want to a clone.
options = _(options).clone()

// Replace options.error with a wrapper.
var error = options.error;
options.error = function(jqXHR, textStatus, errorThrown) {
    alert('error');
    if(error)
        error(jqXHR, textStatus, errorThrown);
};

// Replace options.success with a wrapper.
var success = options.success;
options.success = function(data, textStatus, jqXHR) {
    model.parse(data);
    if(success)
        success(data, textStatus, jqXHR);
};

// We don't need error or success in here anymore.
var params = {
    type: 'POST',
    url:   model.url() 
};
$.ajax(_.extend(params, options));

Förresten, ditt model.parse(data); i din success-hanterare gör förmodligen inget användbart, parse borde bara vara ett enkelt filter, så du skulle vilja göra något (som ett model.set-anrop) med model.parse(data)-returvärdet.