2012-11-13 12 views
26

Chcę dostać moją kolekcję w NON-relaksującego sposób, więc decydują się przesłonić Collection.fetch zoverride szkieletowej za 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); 
      } 
     }); 
    } 
}); 

nie wiem jak ustawić moją kolekcję do odpowiedzi. Jestem nowy w BackboneJS, dziękuję wam wszystkim!

+0

Nie rozumiem tego. po co pisać własny .ajax? pobranie wykonaj bez kodu w ten sam sposób!?!? .. – Moszeed

+6

Styl po stronie serwera nie jest RESTful –

Odpowiedz

56

Jeśli chcesz dodać niestandardową „dekorator” do fetch, ale nie zastąpić go całkowicie, spróbuj:

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); 
     } 

    });  

Tutaj nie trzeba rozwałkować wlasne $.ajax

nie należy również zapominać o return w ostatnim wierszu, jeśli chcesz skorzystać z obietnicy jQuery zwrócony przez fetch metodą szkieletową za.

Aby uzyskać więcej informacji, patrz http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html.

+5

Ta odpowiedź jest dla mnie o wiele bardziej czysta i pozwala ci nie ograniczać się do innych funkcji .Fetch() ma to, czego możesz chcieć użyć później. –

+0

To nie będzie poprawnie wywoływać i tworzyć modeli. – htmldrum

+2

@JRM Czy możesz rozwinąć? – briangonzalez

3

używam coś takiego:

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

Głównym punktem Beeing używam collection.reset(data) ponownie zainicjować kolekcji

+1

Po prostu punkt nitpicking. Czy $ aajax nie jest obietnicą, a zatem powyższy kod może zostać ponownie określony poza $ .when(), tj .: $ .ajax (...). Wtedy (...) powinien działać dobrze? Przyjemna praca nad kolekcją. – seebiscuit

30

Backbone kolekcji ma dwa sposoby, aby ustawić nowe dane dodać i reset. Powiedzmy, że chcesz zamienić wszystkie gromadzenia danych napływających danych i do nich użyć resetu:

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

dziękuję bardzo. –

+0

collection.reset (data), wyszukiwany dla godzin – max4ever

2

Jeśli chcesz zachować fetch „thenable” do obietnic to można też zrobić coś takiego:

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

Jeśli musisz to zrobić dla każdego modelu i/lub gromadzenie, zastąpić Backbone.ajax.

Przesłanie Backbone.ajax daje żądanie options, które normalnie zostanie przekazane do $.ajax. Musisz tylko zwrócić odpowiedź $.ajax (lub inną Promise) i nie musisz się martwić o ustawianie rzeczy w kolekcji/modelu.

Powiązane problemy