jquery ajax 由于 options.data 未为 Backbone.js 集合定义而失败

jquery ajax failing due to options.data being undefined for Backbone.js collections

我正在尝试从我的 .asmx 网络方法中取回一些数据,但它在 ajax 调用时失败了。这是我的一些 JS 代码:

    // BaseCompositeView is basically an object extended from Marionette.CompositeView
    MyListView = App.Base.Objects.BaseCompositeView.extend({
        // contents removed for brevity
    });

    // BaseModel is basically an object extended from Backbone.Model
    MyListView.Model = App.Base.Objects.BaseModel.extend({
        // nothing here
    });

    // BaseCollection is basically an object extended from Backbone.Collection
    MyListView.Collection = App.Base.Objects.BaseCollection.extend({
        url: "../WebServices/MyService.asmx/GetUsers",

        model: MyListView.Model,

        initialize: function(options) {
            this.options = _.extend({}, this.defaults, this.options);

            this.options.data = JSON.stringify({
                "groupID": parseInt(App.Prop.get("GroupID"), 10)
            });
        }

    });

    var group_users_view = new MyListView({
        tagname: "div",
        model: new MyListView.Model(),
        collection: new MyListView.Collection()
    });

我的 web 方法 GetUsers 有 1 个参数,一个名为 groupID 的整数。根据此页面:http://backbonejs.org/#Collection-constructor,在创建 Collection 时调用 MyListView.Collection 中的初始化方法,这发生在实例化 MyListView 时。

错误发生在文件 jquery-1.12.3.js 的以下行中:

xhr.send( ( options.hasContent && options.data ) || null );

在这里,options.data是undefined。但是,url 属性 选项是正确的。那么为什么 jquery ajax 无法识别我传入的数据?

默认情况下,this.options 与传递给对服务器进行的 Ajax 调用的 options 对象之间没有任何关系。

如果您阅读 fetchsync 的源代码,您会发现它们没有引用 this.options 来构建它们的 options 对象。

如果您需要为读取和写入设置数据,您可以覆盖 sync。如果您希望所有 this.options 成为传递给 jQuery.ajax 的内容的一部分,那么您可以使用类似:

sync: function sync(method, collection, options) {
  // It is okay for options to be undefined in the _.extend call.
  options = _.extend({}, options, this.options);
  return MyListView.Collection.__super__.sync.call(this, method, collection, options);
},