在 Backbone.js 中创建自定义“同步”方法

Creating a custom "sync" method in Backbone.js

本文关键字:同步 方法 自定义 创建 Backbone js      更新时间:2023-09-26

在主干中创建自定义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函数。但我也担心干扰任何自定义回调或其他功能,这些功能可能已在使用此模型的应用程序的其他位置指定。

覆盖骨干网sync()方法的"正确"方法是什么?

谢谢!

如果你

看一下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));

顺便说一句,您在success处理程序中的model.parse(data);可能没有做任何有用的事情,parse应该只是一个简单的过滤器,因此您希望对model.parse(data)返回值执行某些操作(例如model.set调用)。