你好骨干忍者,
这是我第一次使用 Backbone - 所以请原谅我的“菜鸟”。在我的功能(较大应用程序的一部分)中,我有一个主干视图 vA,由模型 mA(应该是)支持,并且服务器端位于 Spring MVC 中,具有带有 @RequestBody 和 @ResponseBody 注释的 Spring 控制器方法。我让杰克逊在 Spring 上工作得很好。
现在,在应用程序中,
Backbone.Model
|_ BaseModel (custom base model for our app)
|_ mA (my model)
mA 有自己的端点,它在发出 PUT 请求时,即当我从 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.
},
}
弹簧控制器方法:
@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;
}
此外,在我进行保存调用之前,我修改了一些模型属性,因为服务器端 DTO 具有不同的结构,如下所示:
this.model.unset("abc",{ silent: true });
this.model.set( { abc: {id : "2",xyz:{ ... //more code } );
问题是,调用 save() 会生成一个 PUT 请求并成功调用 Spring 端点处理程序,但我得到一个响应代码 200(这是我所期望的),但是当我使用 Firebug 跟踪调用时,它会进入 onSyncError 方法并给我一条错误消息(因为其中的“默认”案例)。
Backbone 文档说:“当返回 JSON 响应时,发送已被服务器更改的模型属性,需要在客户端更新”。好吧,我不需要在客户端更新模型,它是最后一个屏幕,我只需要告诉用户成功/错误并将他重定向到主页/仪表板。
我又读了一些,似乎代码 200 作为响应是不够的 - 可能有 JSON 解析错误导致同步失败。
我在 Firebug 中检查了响应,响应 JSON 看起来像 {"msg":"Success"}。
那么,可能出了什么问题?