由于对Backbone.js集合未定义的options.data,jquery ajax失败

时间:2016-08-16 20:43:38

标签: jquery ajax backbone.js asmx marionette

我正在尝试从我的.asmx web方法中获取一些数据,但它在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()
    });

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

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

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

此处,options.data为undefined。但是,选项的url属性是正确的。那么为什么jquery ajax不能识别我传入的数据呢?

1 个答案:

答案 0 :(得分:1)

默认情况下,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);
},