Backbone.js - 使用标题参数保存模型

时间:2013-12-18 21:35:56

标签: jquery backbone.js

我正在尝试使用save()将模型发送到REST服务,但我需要传递一个header参数和json数据,以便调用正确的服务(spring可以使用标头来路由调用到正确的处理程序)。也就是说,我并没有真正保存模型,我正在对它执行特定的操作(在这种情况下,这是一个批准操作)。 PUT网址应如下所示:

http://server/name/1

这不应该改变,因为资源标识没有改变。但是,标题应包含一个包含该操作的标题。在这种情况下,我们将调用参数'command',这个特定的例子命令的值是'approve'。

我尝试将带有数据字段的对象添加到保存中:

model.save({data: {command:'approve'}})

但是,这只是将与数据关联的对象添加到请求正文中的json数据。我已经读过这种方法在fetch端工作,可以将给定的数据添加为params,但是在保存时它似乎根据我的期望不起作用。我已经单步执行了主干代码,如果数据选项存在于保存中,它将与模型合并。

由于我无法控制服务接口,因此我必须弄清楚如何设置header参数。任何人都可以给我一些关于如何在保存模型时实现这一目标的指导吗?

2 个答案:

答案 0 :(得分:1)

你可以通过几种不同的方式解决这个问题。

您可以使用自己的实现覆盖Backbone sync,如here所述。在同步实施中,您可以提取某些参数(例如approve),并将其插入到网址中。

或者您可以覆盖Model.url

答案 1 :(得分:0)

几个小时后,我终于想出了一个有效的解决方案。我开始使用save命令:

model.save({command:'approve'})

然后我覆盖了主干的ajax命令:

    Backbone.ajax = function () {
    var args = Array.prototype.slice.call(arguments, 0);

    if (args[0].data) {
        var model = JSON.parse(args[0].data);
        var command = model.command;
        if (command) {
            args[0]['headers'] = { command: command};
        }
    }

    return Backbone.$.ajax.apply(Backbone.$, args);
}

此代码在模型上查找命令值(Backbone.save将其放在那里),并将其推送到标头。下一步是在返回命令之前简单地从模型中删除命令。