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
Backbone.js 我可以在多次设置后保存更改的模型属性吗_Backbone.js - Fatal编程技术网

Backbone.js 我可以在多次设置后保存更改的模型属性吗

Backbone.js 我可以在多次设置后保存更改的模型属性吗,backbone.js,Backbone.js,我多次调用set方法并更改几个属性。然后我想用{patch:true}将更改后的数据发送到服务器 我可以使用model.save(attrs,{patch:true}),但我不知道属性。我无法使用model.toJSON()(不需要的字段)或model.changedAttributes()(仅最后一组)来获取attrs 如何执行此操作?为模型绑定侦听器 若你们在视图中设置值,监听器应该是这样的(最好在初始化函数中写入) 还有你的监听功能 onModelValueChange: functi

我多次调用
set
方法并更改几个属性。然后我想用
{patch:true}
将更改后的数据发送到服务器

我可以使用
model.save(attrs,{patch:true}),但我不知道属性。我无法使用
model.toJSON()
(不需要的字段)或
model.changedAttributes()
(仅最后一组)来获取
attrs


如何执行此操作?

为模型绑定侦听器

若你们在视图中设置值,监听器应该是这样的(最好在初始化函数中写入)

还有你的监听功能

  onModelValueChange: function(model, args) {
      model.save(args.changed, {patch: true});
  }
根据:

或者,可以传入外部属性散列,返回该散列中与模型不同的属性

因此,您可以尝试在开始修改之前缓存使用的模型的状态。修改完成后,将新状态传递给
changedAttributes
方法以检索更改的属性哈希,然后发送补丁请求。差不多

var oldAttrs = model.toJSON();

// ...do modifications here

var changedAttrs = model.changedAttributes(oldAttrs);
dataTosend = model.pick(_.keys(changedAttrs));
model.save(dataTosend, {patch: true});
然而,我有更好的方法来实现他的建议

我宁愿在应用程序开始或视图初始化时保留模型的主副本,而不是对属性进行原始克隆

this.master = this.model.clone();
// ... then changes are made to this.model
准备保存时,使用主模型比较属性并直接检索更改

var changes = this.master.changedAttributes(this.model.attributes);
if (changes !== false) this.model.save(changes, { patch: true });
这样,您就可以跳过
dataTosend=model.pick(u.keys(changedAttrs))
,因为
changes
已经是与主模型初始状态存在所有差异的对象

如果是在模型保存后重新使用的视图:

var View = Backbone.View.extend({
    initialize: function() {
        this.updateMaster();
    },

    saveChanges: function() {
        var changes = this.master.changedAttributes(this.model.attributes);
        if (changes !== false) {
            this.model.save(changes, {
                patch: true,
                context: true,
                success: this.updateMaster
            });
        }
    },

    updateMaster: function() {
        this.master = this.model.clone();
    },
});

您到底想向服务器发送什么,仅更改的属性或模型中存在的所有属性或某些属性可以在示例中显示仅更改的属性您可以在模型上绑定侦听器。。。。。只要模型值随属性的改变而改变,侦听器函数就会立即执行。您可以将其发送到服务器,例如:Model is
{\u id:1,field1:0,field2:0,field3:0}
I execute
Model.set({field2:2});model.set({field1:1});模型保存(…)。我想发送到服务器
{field2:2,field1:1}
,但我想调用
保存
,只要我认为有必要在主干github上创建问题。。。依我看。我认为如果
保存
在第一个参数上不使用attrs保存所有更改的属性会很好。谢谢,这似乎是目前最好的方法。
var View = Backbone.View.extend({
    initialize: function() {
        this.updateMaster();
    },

    saveChanges: function() {
        var changes = this.master.changedAttributes(this.model.attributes);
        if (changes !== false) {
            this.model.save(changes, {
                patch: true,
                context: true,
                success: this.updateMaster
            });
        }
    },

    updateMaster: function() {
        this.master = this.model.clone();
    },
});