2016-08-16 7 views
0

Я пытаюсь получить некоторые данные из моего веб-метода .asmx, но он не работает при вызове ajax. Вот некоторые из моих JS кода:jquery ajax failing из-за того, что 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() 
    }); 

Мой веб-метод GetUsers принимает 1 параметр, целое число с именем GroupID. Согласно этой странице: http://backbonejs.org/#Collection-constructor, метод инициализации внутри MyListView.Collection вызывается при создании коллекции, которая происходит при создании экземпляра MyListView.

Ошибка происходит внутри файла Jquery-1.12.3.js на следующей строке:

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

Здесь options.data является undefined. Однако свойство URL-адресов правильное. Итак, почему jquery ajax не распознает данные, которые я передаю?

ответ

1

По умолчанию нет связи между this.options и объектом options, который передается на вызовы Ajax, сделанные на ваш сервер.

Если вы прочитали исходный код fetch или sync, вы увидите, что они не ссылаются на 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