8

你好骨干忍者,

这是我第一次使用 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"}。

那么,可能出了什么问题?

4

4 回答 4

9

Backbone.Model.save()期望来自服务器的响应是模型值的更新散列。如果您的回复是那种{"msg":"Success"},Backbone 可能无法与您的模型同步。基本上,它将您的 HTTP 200 JSON 响应解释为模型的属性,并尝试相应地同步模型。

您可以尝试 1) 让 Spring 控制器路径返回 JSON 化的模型响应,2) 返回带有空响应主体的普通 200 或 3) 编写自定义解析方法,以查找具有{"msg":"Success"}格式的响应并做出不同的响应。

于 2013-06-06T19:50:10.443 回答
1

谢谢你的时间。我终于能够通过使用 $.ajax 发出 PUT 请求来解决这个问题,从而绕过整个 Backbone 同步的东西。我在 ajax 回调中的成功处理程序处理了响应,并且没有更多的同步错误(因为它没有被调用):)

于 2013-06-06T20:03:14.877 回答
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) 在我的情况下失败,并且保存函数在触发任何事件之前返回 false。

也许这不是你的问题,但希望它会帮助其他人......

于 2013-10-23T14:25:05.993 回答
0

验证您的 JSON 响应.. 就我而言,我有一个额外的逗号 (,).. 几乎无效的响应可能会导致此问题

于 2019-03-22T06:36:33.340 回答