【问题标题】:jquery ajax failing due to options.data being undefined for Backbone.js collections由于未为 Backbone.js 集合定义 options.data 导致 jquery ajax 失败
【发布时间】:2016-08-16 20:43:38
【问题描述】:

我正在尝试从我的 .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()
    });

我的 web 方法 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。但是 options 的 url 属性是正确的。那么为什么 jquery ajax 不能识别我传入的数据呢?

【问题讨论】:

    标签: jquery ajax backbone.js asmx marionette


    【解决方案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);
    },
    

    【讨论】:

    • 谢谢路易斯!你是绝对正确的。我需要在我的收藏中添加一个同步方法。这是拼图中缺失的一块。基本上,在这里,我添加了一个条件来检查该方法是否为“读取”,如果是,则调用一个最终调用$.ajax() 的自定义方法。这个自定义方法调用是我将在我的集合的初始化方法中初始化的collection.options.data 传递的地方。
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2019-09-09
    • 2011-09-23
    • 2018-08-30
    • 2022-06-10
    • 1970-01-01
    • 2010-09-20
    • 2021-01-18
    相关资源
    最近更新 更多