6

sync()在主干中创建自定义方法。

我想这样做是“正确的”,并尽可能少地干扰 Backbone 的正常功能。

这是我到目前为止的代码:

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));
    }
 });

我遇到的问题是该行:$.ajax(_.extend(params, options));似乎正在覆盖我创建的自定义successerror函数。但我也担心会干扰任何自定义回调或其他可能已在使用此模型的应用程序中指定的其他功能。

覆盖Backbone的方法的“正确”方法是sync()什么?

谢谢!

4

1 回答 1

8

如果你看一下,Model#fetch你会看到 Backbone 使用的常用方法:

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);
  };
  //...
}

所以 Backbone 只是用一个调用原始函数的新函数替换了该函数。在你的情况下,你会有这样的事情:

// 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));

顺便说一句,您model.parse(data);success处理程序中可能没有做任何有用的事情,parse应该只是一个简单的过滤器,所以您想用返回值做一些事情(例如model.set调用) 。model.parse(data)

于 2012-08-19T19:00:49.563 回答