Backbone.Model.save并且不更新客户端

时间:2013-08-14 22:40:08

标签: backbone.js

我想在Backbone模型上调用save并让它将数据写入服务器,但更新客户端。我该怎么做?

澄清一下:当Backbone保存模型时,它会将所有数据发送到服务器,然后从服务器检索数据并在客户端上对其进行更新。第二步是我不希望发生的事情。

进一步澄清:模型('父'模型)有一个属性,它本身就是一个模型('子'模型);当它保存到服务器时,此子模型将转换为JSON。当父模型在保存之后更新时,先前包含对子模型的引用的属性将替换为已保存的子模型的已解析JSON对象。这是我不需要发生的事情。

当数据最初从服务器中拉出时,父模型将该对象“重建”为适当的子模型,但这是一个昂贵的过程,没有理由重新执行每次在父模型上保存火灾,因为子模型永远不会改变。

4 个答案:

答案 0 :(得分:3)

当您在parse

上收到服务器的回复时,您似乎不想model.save您的模型

您可以尝试以下内容:

model.save(attributes,{
  success: function() { ... },
  parse  : false     // This will be passed to your parse function as an option
});

您必须在相应的model中设置您的解析功能,如下所示:

parse: function(resp,options) {
  // don't update model with the server response if {parse:false} is passed to save
  if (options && !options.parse) return;

  / ... rest of your parse code ... /

Backbone目前默认options.parsetrueHere是关于该主题的简短讨论。

正如该线程中所讨论的,也许您想要考虑为什么您不希望更新服务器对客户端的响应。可能有一种更清洁的方式来实现您想要的结果。

答案 1 :(得分:2)

根据您的服务器设置的方式/内容,您真正需要做的就是发出常规的AJAX请求。这正是骨干在后台所做的事情,因此您将绕过客户端逻辑。

您可以使用原生JavaScript执行此操作,但我相当确定您正在使用其他可以使事情变得更容易的库。

为了完整答案,我将举例说明jQuery:

$.ajax({
  type: "POST",
  url: "http://same.as.your.model",
  data: { "the" : "model" },
  dataType: "JSON",
  success: function(){
    // once the request has returned
  }
});

$.ajax功能还有一些附加功能,您可以阅读in the jQuery docs

答案 2 :(得分:0)

在客户端,你的意思是观点?如果您要保存模型但不渲染自save会触发change事件后发生的观看,则应使用选项save致电silent:true,或设置自定义调用dontchange:true时选项save,并在处理change时将其签入。我更喜欢自定义选项,因为silent有副作用(至少在我的骨干1.0.0版本中)

一点代码:

保存时

model.save({},{dontchange: true});

在视图中安装事件监听器:

this.listenTo(model, 'change', function(model, options){
  if (options.dontchange)
    return;
  this.render();
});

答案 3 :(得分:0)

我遇到了同样的问题。 model.save(attrs,{patch:true, parse:false})确实没有调用解析方法,但模型仍然与服务器响应合并。

这不优雅,但这对我有用:

model.clone().save(attrs,{patch:true})

我认为最好通过干净的REST api设计来避免这种情况。