2012-04-04 4 views
13

szukam lepszego rozwiązania na dwie rzeczy:backbone.js: elegancki sposób, aby sprawdzić, czy dane gotowy i jeśli zestaw danych jest pusta

  • Jak mogę rozumieć, jeśli dane są pobierane i gotowe , Używam BasicDealList.on("reset", function(){}), aby zrozumieć, czy dane są pobierane z ajax i parsowane i gotowe do użycia, ale czuje się brudny.

  • Jeżeli pusty JSON pochodzi od pobierania takich jak {}, to nadal pokazuje BasicDealList.length jako 1, podczas gdy powinno być 0 więc musiałem sprawdzić, czy pierwszy element jest pusty poprzez collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0] który jest bardzo brzydki.

Oto kod:

BasicDeal = Backbone.Model.extend();  
BasicDealCollection = Backbone.Collection.extend({ 
    model: BasicDeal, 
    url: '/some/ajax/url/', 
}); 
BasicDealList = new BasicDealCollection(); 

BasicDealList.on("reset", function(collection, response){ 
    isEmpty = collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]); 
    if (isEmpty){ 
    // render no deal found html 
    } 
    else{ 
    // render list of deals 
    } 
} 
BasicDealList.fetch(); 

Odpowiedz

25

Jeśli nie lubisz słuchać na reset, można przejść bezpośrednio do .fetch() zwrotnego:

BasicDealList.fetch({ 
    success: function(collection, response){ 
     // ... 
    } 
}); 

Jeżeli w dalszej części aplikacji, chcesz wiedzieć, czy już pobrałeś dane, możesz zazwyczaj po prostu sprawdzić BasicDealList.length. Jeśli chcesz uniknąć powtarzających się żądań kolekcji, które są faktycznie puste na serwerze, prawdopodobnie będziesz musiał opracować niestandardowe rozwiązanie, np. ustawienie flagi na .fetch():

BasicDealList.fetch({ 
    success: function(collection, response){ 
     BasicDealList.fetched = true; 
     // ... 
    } 
}); 

chodzi o pustym numerze danych, powinien być powrót [] z serwera zamiast {}. Kolekcja Backbone's wywołuje this.add(models, ...) w obrębie .reset(), a .add() sprawdza, czy argument models jest tablicą; jeśli nie, to zawija je w jednym:

models = _.isArray(models) ? models.slice() : [models]; 

Więc przechodząc {} spowoduje models zestaw do [{}], co nie jest to, co chcesz. Jeśli nie możesz kontrolować serwera, możesz wykonać test na {} w niestandardowej metodzie .parse(), zwracając [], jeśli zostanie znaleziony.

+0

Dziękuję bardzo za szczegółowe wyjaśnienie! – Hellnar

7

Potrzebowaliśmy sposobu, aby stwierdzić, czy relacja RelationModel została pobrana, czy nie. To jest nasze rozwiązanie (w Coffeescript).

initialize: (objects, options) -> 
    @fetched = false 
    @listenTo @, 'sync', -> @fetched = true 
12

Wiem, że to pytanie zostało już odebrane, ale tutaj jest alternatywa.

Najważniejszą korzyścią jest to, że używamy funkcji "kiedy". Funkcja "kiedy" daje nam możliwość sprawdzania wielu wywołań pobierania i wykonywania jednego sukcesu.

$.when(deferredOne, deferredTwo, deferredThree).then(function() { 
    // do stuff when we have the data. 
}); 

Ponadto, jeśli zapisaliśmy odroczony obiekt do zmiennej, możemy zrobić takie rzeczy. Zmienna będzie flagą informującą nas, że już załadowaliśmy dane.

if (deferred.state() === "resolved") { 
    // do stuff when we have the data. 
} 

Kiedy wzywamy fetch() na zbiorze zwraca obiekt jQuery odroczony.Obiekt odroczony jQuery może znajdować się w 3 stanach, "oczekujących", "odrzuconych" lub "rozwiązanych", a gdy już dysponujemy danymi, ustawi stan odroczonego obiektu do rozstrzygnięcia.

Powiązane problemy