我试图覆盖 Backbone.sync,以便在每次获取模型时设置“id”属性。这样,我确信下一个 model.save() 将触发 update 而不是 create,即使 fetch() 没有使用 id 进行响应。
Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
var params = _.clone(options);
params.success = function(model) {
if(method == 'read' && model.isNew()) {
var id = Math.floor(Math.random()*1000);
model.set({ "id": id });
}
if(options.success) options.success(model);
};
Backbone._sync(method, model, params);
}
但是传递给 success 函数的模型似乎不是 Backbone 模型,而只是一个对象。所以我不能在其上使用任何方法(如 model.isNew())。知道我做错了什么吗?
最佳答案
听起来您可能想要覆盖 Model.fetch
或 Model.parse
而不是 Backbone.sync
。 Backbone.sync
仅采用 $.ajax()
选项,因此 success
回调仅接收来自服务器的 JSON 响应,而不是实例化型号。
默认的 Model.fetch()
回调如下所示:
options.success = function(resp, status, xhr) {
if (!model.set(model.parse(resp, xhr), options)) return false;
if (success) success(model, resp);
};
这里 model
指的是当前实例,如您所愿。因此,您可能会考虑重写 Model.fetch
以添加 id(如果不存在),或者,可能更好的是,重写 model.parse()
,默认情况下这是一个传递,并且旨在作为一个钩子(Hook)让您咀嚼服务器数据。我对你的随机数 id 实现并不感到兴奋,因为仍然有可能发生冲突,特别是如果你正在制作很多模型 - 你可以尝试使用 model.cid
(保证是唯一的在客户端中,尽管它可能与服务器提供的 ID 发生冲突)或 Underscore 的 _.uniqueId() :
parse: function(resp, xhr) {
if (this.isNew() && !resp.id) {
resp.id = _.uniqueId('model-');
}
}
关于javascript - 覆盖 Backbone.sync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896714/