2016-08-16 45 views
0

我試圖從我的.asmx web方法獲取一些數據,但它在ajax調用時失敗。下面是我的一些JS代碼:jquery ajax由於options.data未能定義爲Backbone.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個參數,命名組ID的整數。根據此頁面:http://backbonejs.org/#Collection-constructor,MyListView.Collection中的initialize方法在創建集合時調用,當MyListView被實例化時會發生這種情況。

該錯誤發生在下面的行的文件的jquery-1.12.3.js內:

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

這裏,options.data是undefined。但是,選項的url屬性是正確的。那麼,爲什麼jQuery Ajax不能識別我傳入的數據?

回答

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); 
}, 
+0

感謝路易斯!你是絕對正確的。我需要爲我的收藏添加同步方法。這是謎題中缺失的一部分。基本上,在這裏,我添加了一個條件來檢查該方法是否爲「讀取」,如果是,則調用一個最終調用'$ .ajax()'的自定義方法。這個自定義方法調用是我在我的'collection.options.data'中傳入的,它在我的集合的初始化方法中初始化。 – SpartaSixZero