Hello Backbone ninjas,
这是我第一次使用Backbone - 所以请原谅我的“noob”。 在我的功能(一个更大的应用程序的一部分)中,我有一个Backbone View vA,由一个模型mA(应该是)支持,服务器端在Spring MVC中,带有@RequestBody和@ResponseBody的带有注释的Spring控制器方法。我和杰克逊一起工作很好。
现在,在应用程序中,
Backbone.Model
|_ BaseModel (custom base model for our app)
|_ mA (my model)
mA有自己的端点,当发出PUT请求时,Backbone成功调用它,即当我从View vA中的提交按钮事件处理程序调用save()时,如下所示:
this.model.save({
success : function(){
alert('Request submitted successfully');
},
error : function(){
alert('Something awful happened.');
}
});
我们的BaseModel具有以下内容:
define([], function() {
window.BaseModel = Backbone.Model.extend({
......
});
onSyncError : function(model, response) {
switch (response.status) {
case 403:
[...//some more code ]
default:
alert(bundle.getDefault('HTTP_RESP_OTH') + response.status);
}
},
onSyncSuccess : function(model, response) {
alert('Sync done! ');
},
sync : function(method, model, options) {
options.error = this.onSyncError;
Backbone.sync.call(this, method, model, options);
....//some more stuff.
},
}
Spring控制器方法:
@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes = {"application/json"}
, produces = {"application/json"})
@ResponseBody
public Map<String,String> methodX(@RequestBody XyzDTO xyzDTO){
....
map.put("msg", "success");
return map;
}
此外,在我进行保存调用之前,我修改了一些Model属性,因为服务器端DTO具有不同的结构,如下所示:
this.model.unset("abc",{ silent: true });
this.model.set( { abc: {id : "2",xyz:{ ... //more code } );
问题是,调用save()会生成一个PUT请求并成功调用Spring端点处理程序,但是我得到一个响应代码200(这是我所期望的), 但是当我使用Firebug跟踪调用时,它会进入onSyncError方法并给我一条错误消息(因为它中有“默认”情况)。
Backbone doc说:“当返回JSON响应时,请发送已由服务器更改的模型属性,并且需要在客户端上更新”。好吧,我不需要在客户端更新模型,它是最后一个屏幕之一,我只需要告诉用户成功/错误, 将他重定向到主页/仪表板。
我还读了一些,似乎代码200因为响应不充分 - 可能存在JSON解析错误导致同步失败。
我检查了Firebug中的响应,响应JSON看起来像{“msg”:“Success”}。
那么,可能会出现什么问题?
答案 0 :(得分:9)
Backbone.Model.save()
期望服务器的响应是模型值的更新散列。如果您的回复类型为{"msg":"Success"}
,则Backbone可能无法与您的模型同步。基本上,它将您的HTTP 200 JSON响应解释为模型的属性,并尝试相应地同步模型。
你可以尝试1)使你的Spring控制器路径返回一个JSON-ified模型响应,2)返回一个带有空响应体的plain 200或者3)编写一个查找响应的自定义parse方法{"msg":"Success"}
格式并以不同方式响应。
答案 1 :(得分:1)
感谢您的时间。我终于能够通过使用$ .ajax来解决问题,从而绕过整个Backbone同步问题。我在ajax回调中的成功处理程序处理响应,并且没有更多同步错误(因为它不会被调用):)
答案 2 :(得分:0)
我将分享我对同样问题的经验; 自定义基础模型和 调用model.save并且没有触发成功事件。
我的问题是基本模型中的自定义设置函数没有返回“this”。
如果您查看模型保存的主干源代码,您将找到以下代码段:
options.success = function(resp) {
// Ensure attributes are restored during synchronous saves.
model.attributes = attributes;
var serverAttrs = model.parse(resp, options);
if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
return false;
}
if (success) success(model, resp, options);
model.trigger('sync', model, resp, options);
};
!model.set(serverAttrs,options)在我的情况下失败,并且save-function在触发任何事件之前返回false。
也许这不是你的问题,但希望它会帮助其他人......
答案 3 :(得分:0)
验证您的JSON响应。 就我而言,我还有一个逗号(,)。 无效的回复可能会导致此问题