javascript - 覆盖 Backbone.sync

标签 javascript backbone.js

我试图覆盖 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.fetchModel.parse 而不是 Backbone.syncBackbone.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/

相关文章:

javascript - 如何获取特定属性并将其放入backbone.js 的集合中?

javascript - 通过 jQuery slider/Backbone 动态更新字段

javascript - BackboneJS 删除背面的旧 View ?

HTML 输入框内的 Javascript 函数

javascript - 响应式网页设计问题

javascript - 如何遍历数据集合并返回整个对象?

javascript - 如何按以 $(this) 开头的类从父级中选择子级

javascript - 使用 jQuery 根据搜索关键字过滤表数据

javascript - 我应该如何在backbone.marionette中测试/监视此类事件

javascript - 将 Backbone 集合与数组进行比较