2016-08-16 2 views
0

J'essaie d'obtenir des données à partir de ma méthode web .asmx, mais il échoue à l'appel ajax. Voici mon code JS:jquery ajax échoue en raison d'options.data étant indéfini pour les collections 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() 
    }); 

Ma méthode web GetUsers prend 1 paramètre, un entier nommé groupID. Selon cette page: http://backbonejs.org/#Collection-constructor, la méthode initialize dans MyListView.Collection est appelée lors de la création de la collection, ce qui se produit lorsque MyListView est instancié.

L'erreur se produit dans le fichier jquery-1.12.3.js sur la ligne suivante:

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

Ici, options.data est undefined. Cependant, la propriété url des options est correcte. Alors, pourquoi jquery ajax ne reconnaît-il pas les données que je transmets?

Répondre

1

Par défaut, il n'existe aucune relation entre this.options et l'objet options transmis aux appels Ajax effectués sur votre serveur. Si vous lisez le code source fetch ou sync, vous verrez qu'ils ne se réfèrent pas à this.options pour construire leurs objets options.

Si vous devez définir vos données pour la lecture et l'écriture, vous pouvez remplacer sync. Et si vous voulez que tous this.options à faire partie de ce qui est passé à jQuery.ajax, alors vous pourriez avoir quelque chose comme:

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

Merci Louis! Vous avez absolument raison. J'avais besoin d'ajouter une méthode de synchronisation à ma collection. C'était la pièce manquante du puzzle. Fondamentalement, ici, j'ai ajouté une condition pour vérifier si la méthode est "read" et si oui, alors évoquer une méthode personnalisée qui finit par appeler '$ .ajax()'. Cet appel de méthode personnalisée est l'endroit où je passerais dans mon 'collection.options.data' qui a été initialisé dans la méthode initialize de ma collection. – SpartaSixZero