如何让骨干模型做一个POST对fetch

How to get backbone model to do a POST on fetch?

本文关键字:一个 POST fetch 模型      更新时间:2023-09-26

我试图让骨干做一个POST当我调用fetch模型,但没有我已经尝试到目前为止似乎工作。我还需要在fetch中传递多个参数(不仅仅是ID),并且需要使用jsonp.

我尝试在模型中重写同步方法,看起来像下面这样,这样它就会做POST,但它似乎不起作用(一个GET调用仍在进行中)。

sync: function(method, model, options) {
      if (method === "read") {
        method = "create";
      }
      return Backbone.sync.call(this, method, model, options);
}

取回是这样的

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

你知道为什么这个不能工作吗?

非常感谢!

您可以将type作为fetch方法options参数的一部分传递。将要发生的是,Backbone将sync你的请求作为一个read方法,它是,就在调用jQuery的ajax方法之前,它将覆盖type,你可以在Backbone的源代码中看到。

var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
所以你的代码应该是这样的:
var model = new MyModel();
var deferred = model.fetch({
    type: "post",
    dataType: "jsonp",
    data: {
      parm1: "somevalue",
      parm2: false,
      parm3: {
        type1: "abc",
        type2: "123"
      }
    }
});

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

您需要在传递给Backbone.sync的选项中设置type为"post"。正如sync文档中提到的,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);
}