2012-11-13 4 views
26

Je veux obtenir ma collection d'une manière non-RESTful, donc je décide de passer outre le Collection.fetch avecoverride Backbone Collection-fetch

App.carClc = Backbone.Collection.extend({ 
    model : App.cardModel, 
    url : 'http://localhost/bbtest/data.php', 
    fetch : function() { 
     $.ajax({ 
      type : 'GET', 
      url : this.url, 
      success : function(data) { 
       console.log(data); 
      } 
     }); 
    } 
}); 

Je ne sais pas comment définir ma collection à la réponse. Je suis nouveau à BackboneJS, merci à vous tous!

+0

Je ne comprends pas. pourquoi écrire un $ .ajax? le fetch le fait sans votre code de la même manière!?!? .. – Moszeed

+6

le style côté serveur n'est pas RESTful –

Répondre

56

Si vous souhaitez ajouter une commande « décorateur » à fetch, mais pas l'ignorer complètement, essayez:

var MyCollection = Backbone.Collection.extend({ 

     //custom methods 

     fetch: function(options) { 

      //do specific pre-processing 

      //Call Backbone's fetch 
      return Backbone.Collection.prototype.fetch.call(this, options); 
     } 

    });  

ici, vous ne devez pas rouler votre propre $.ajax

en outre, ne pas oublier la return dans la dernière ligne si vous souhaitez utiliser la promesse jQuery retournée par la méthode de Backbone fetch. Pour plus de détails, voir http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html pour plus de détails.

+5

Cette réponse me semble beaucoup plus propre, et vous permet de ne pas vous limiter à d'autres fonctionnalités .fetch() que vous voudrez peut-être utiliser plus tard. –

+0

Cela ne va pas appeler correctement et créer des modèles. – htmldrum

+2

@JRM Pouvez-vous développer s'il vous plaît? – briangonzalez

3

J'utilise quelque chose comme ceci:

$.when($.ajax(URL, { dataType: "json" })) 
    .then($.proxy(function(response) { 
      ctx.view.collection.reset(response);        
    },ctx)); 

Le principal point beeing J'utilise collection.reset(data) pour réinitialiser la collection

+1

Juste un point de nitpicking. Est-ce que $ .ajax n'est pas une promesse, et donc le code ci-dessus peut être reformulé en dehors de $ .when(), c'est-à-dire: .ajax (...). Alors (...), devrait fonctionner correctement? Beau travail sur la collection, cependant. – seebiscuit

30

collection Backbone a deux méthodes pour définir de nouvelles données et ajouter réinitialisés. Disons que vous voulez remplacer toutes les données de collecte des données entrantes et à cet effet utiliser la réinitialisation:

App.carClc = Backbone.Collection.extend({ 
model : App.cardModel, 
url : 'http://localhost/bbtest/data.php', 
fetch : function() { 
    // store reference for this collection 
    var collection = this; 
    $.ajax({ 
     type : 'GET', 
     url : this.url, 
     dataType : 'json', 
     success : function(data) { 
      console.log(data); 
      // set collection data (assuming you have retrieved a json object) 
      collection.reset(data) 
     } 
    }); 
} 
}) 
+0

merci beaucoup. –

+0

collection.reset (data), recherché pendant des heures – max4ever

2

Si vous souhaitez conserver fetch « thenable » pour les promesses alors vous pourriez aussi faire quelque chose comme ceci:

fetch: function() { 
    var self = this, 
     deferred = new $.Deferred(); 

    $.get(this.url).done(function(data) { 
      // parse data 
     self.reset({parsed data}); 
     deferred.resolve(); //pass in anything you want in promise 
    }); 
    return deferred.promise(); 
} 
0

Si vous avez besoin de faire cela pour tous les modèles et/ou d'une collection, passer outre Backbone.ajax.

En surpassant Backbone.ajax vous donne la demande options qui serait normalement passée à $.ajax. Vous avez seulement besoin de renvoyer la réponse de $.ajax (ou un autre Promise) et vous n'avez pas besoin de vous soucier de la mise en place de la collection/du modèle.