如何让骨干模型在fetch上进行POST?

时间:2014-05-28 22:22:34

标签: javascript backbone.js

当我在一个模型上调用fetch时,我试图让骨干进行POST,但到目前为止我没有尝试过的任何东西似乎都能正常工作。我还需要在fetch中传递多个参数(而不仅仅是一个ID),并且需要使用jsonp。

我尝试覆盖模型中的sync方法,使其显示如下,以便它可以执行POST,但它似乎无法正常工作(仍在进行GET调用)。

sync: function(method, model, options) {
      if (method === "read") {
        method = "create";
      }

      return Backbone.sync.call(this, method, model, options);
}

fetch看起来像这样:

var model = new MyModel();
var deferred = model.fetch({
        dataType: "jsonp",
        data: {
          parm1: "somevalue",
          parm2: false,
          parm3: {
            type1: "abc",
            type2: "123"
          }
        }
});

关于为什么这不起作用的任何想法?

非常感谢!!

2 个答案:

答案 0 :(得分:2)

您可以将type作为fetch方法options参数的一部分传递。 会发生什么情况,Backbone将sync您的请求read作为ajax方法,就在调用jQuery的type方法之前,它将覆盖var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); ,就像您一样可以在Backbone的源代码中看到。

var model = new MyModel();
var deferred = model.fetch({
    type: "post",
    dataType: "jsonp",
    data: {
      parm1: "somevalue",
      parm2: false,
      parm3: {
        type1: "abc",
        type2: "123"
      }
    }
});

所以你的代码看起来应该是这样的:

options

请记住,传递给fetch方法的ajax基本上是jQuery的{{1}}选项,扩展了Backbone的选项。

答案 1 :(得分:0)

您需要在传递给type的选项中将Backbone.sync设置为“发布”。正如sync docs中提到的,options是“成功和错误回调,以及所有其他jQuery请求选项”:

sync: function(method, model, options) {
  var opts = options;

  if (method === "read") {
    method = "create";
    opts = $.extend({}, opts, {
      type: "post"
    });
  }

  return Backbone.sync.call(this, method, model, opts);
}