2

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

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

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

最初从服务器提取数据时,父模型将该对象“重构”为适当的子模型,但这是一个昂贵的过程,没有理由每次在父模型上触发时都重新执行此操作,因为子模型永远不会改变。

4

4 回答 4

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 ... /

骨干网目前默认options.parsetrue. 是关于该主题的简短讨论。

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

于 2013-08-15T07:50:54.347 回答
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函数还具有一些附加功能,您可以在 jQuery 文档中阅读有关它的信息。

于 2013-08-14T22:50:04.917 回答
0

在客户端,您的意思是视图?如果你想保存你的模型但不渲染你的视图,因为这save会触发一个change事件,你应该save使用 option调用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();
});
于 2013-08-14T23:53:04.643 回答
0

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

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

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

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

于 2017-01-30T17:09:11.490 回答