Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js:智能更新已更改属性的列表_Javascript_Backbone.js_Model_Save_Crud - Fatal编程技术网

Javascript Backbone.js:智能更新已更改属性的列表

Javascript Backbone.js:智能更新已更改属性的列表,javascript,backbone.js,model,save,crud,Javascript,Backbone.js,Model,Save,Crud,我知道这个问题已经讨论过好几次了,但我找不到一个答案来回答它的许多方面,我将在这里尝试解释 Modelsave()在客户端和服务器之间保持同步。Backbone.js促使您以以下两种方式之一使用它(afaik): 保存模型的所有项目:这会将所有内容发送到 服务器,甚至仅在客户端使用的属性和属性 这一点没有改变。这是新模型的默认设置(当 model.isNew()返回true) 使用补丁保存:true将只发送已更改的属性 将模型复制到服务器。在主干中,它意味着仅 将发送changedAttribu

我知道这个问题已经讨论过好几次了,但我找不到一个答案来回答它的许多方面,我将在这里尝试解释

Model
save()
在客户端和服务器之间保持同步。Backbone.js促使您以以下两种方式之一使用它(afaik):

  • 保存模型的所有项目:这会将所有内容发送到 服务器,甚至仅在客户端使用的属性和属性 这一点没有改变。这是新模型的默认设置(当
    model.isNew()
    返回
    true
  • 使用
    补丁保存:true
    将只发送已更改的属性 将模型复制到服务器。在主干中,它意味着 将发送
    changedAttributes()
    返回的属性
  • 关键是
    changedAttributes()
    只返回自上次
    change
    事件以来的更改。这对于不总是更新的模型很有用,并且实际上可以在任何更改时自动发出ajax请求

    但是,如果您有一个不断变化的模型(例如,代码/文本编辑器或可以拖放并跟踪其位置的元素),则不能只在每个
    变化
    事件中保存。您需要每隔一段时间保存自上次调用
    save()
    以来更改的所有属性


    你认为Backbone.js实际上为这种同步提供了很好的支持吗?Bakcbone.js是否跟踪自上次
    save()
    (而不仅仅是自上次
    change
    事件)以来的更改?或者您必须“手动”完成此操作?

    您必须使用自己的基础模型扩展主干模型

    var BaseModel = Backbone.Model.extend({
        save: function(key, val, options){
            var attrs
            if (key == null || typeof key === 'object') {
              attrs = key;
              options = val;
            } else {
               (attrs = {})[key] = val;
            }  
            attrs = _.extend(this.unsaved || {}, attrs);
            this.unsaved = {};
            return Backbone.Model.prototype.save.call(this, attrs, options);
        },
        set: function(key, val, options) {
           var attr
           if (key == null) return this;
           if (typeof key === 'object') {
              attrs = key;
              options = val;
           } else {
             (attrs = {})[key] = val;
           }
           this.unsaved = _.extend(this.unsaved || {}, attrs);
           return Backbone.Model.prototype.save.call(this, attrs, options);
        }
    });
    
    完全未经测试的代码,但应该非常接近您需要执行的操作