在 backbone 中创建一个自定义的 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));
似乎覆盖了自定义的 success
和error
我创建的函数。但我也担心会干扰任何自定义回调或可能已在使用此模型的应用程序中其他地方指定的其他功能。
覆盖 Backbone 的 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));
顺便说一句,您的 model.parse(data);
在您的 success
处理程序中可能没有做任何有用的事情,parse
应该只是一个简单的过滤器,所以你想用 model.parse(data)
返回值做一些事情(比如 model.set
调用)。
关于javascript - 在 Backbone.js 中创建自定义 "sync"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028829/