我想在Backbone模型上调用save
并让它将数据写入服务器,但不更新客户端。我该怎么做?
澄清一下:当Backbone保存模型时,它会将所有数据发送到服务器,然后从服务器检索数据并在客户端上对其进行更新。第二步是我不希望发生的事情。
进一步澄清:模型('父'模型)有一个属性,它本身就是一个模型('子'模型);当它保存到服务器时,此子模型将转换为JSON。当父模型在保存之后更新时,先前包含对子模型的引用的属性将替换为已保存的子模型的已解析JSON对象。这是我不需要发生的事情。
当数据最初从服务器中拉出时,父模型将该对象“重建”为适当的子模型,但这是一个昂贵的过程,没有理由重新执行每次在父模型上保存火灾,因为子模型永远不会改变。
答案 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.parse
为true
。 Here是关于该主题的简短讨论。
正如该线程中所讨论的,也许您想要考虑为什么您不希望更新服务器对客户端的响应。可能有一种更清洁的方式来实现您想要的结果。
答案 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设计来避免这种情况。