2012-04-04 9 views
13

Ich bin für eine bessere Lösung für zwei Dinge suchen:Backbone.js: Elegante Art und Weise, wenn die Daten bereit zu prüfen, und wenn der Datensatz ist leer

  • Wie kann ich verstehen, wenn die Daten abgerufen und bereit Verwende ich BasicDealList.on("reset", function(){}), um zu verstehen, ob die Daten von AJAX geholt und geparst und bereit sind, verwendet zu werden, aber es fühlt sich schmutzig an.

  • Wenn ein leeres JSON von Abrufen wie {} kommt, es zeigt immer noch BasicDealList.length als 1, während es 0 sein sollte, so war ich gezwungen, zu überprüfen, ob das erste Element über collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0] leer ist, die sehr hässlich ist. Hier

ist der Code:

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

Antwort

25

Wenn Sie nicht wie für reset hören, können Sie einen Rückruf direkt an .fetch() passieren kann:

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

Wenn später in Ihrem App, möchten Sie wissen, ob Sie die Daten bereits abgerufen haben, können Sie in der Regel nur überprüfen BasicDealList.length. Wenn Sie es vermeiden möchten, wiederholte Anforderungen für Sammlungen zu stellen, die tatsächlich auf dem Server leer sind, müssen Sie wahrscheinlich eine benutzerdefinierte Lösung ausarbeiten, z. eine Fahne .fetch() Einstellung:

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

Wie für die leere Daten Problem, sollten Sie [] vom Server statt {} zurückkehren. Backbones Sammlung ruft this.add(models, ...) innerhalb .reset() auf, und .add() überprüft, ob das models Argument ein Array ist; wenn es nicht, es wickelt es in einem:

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

in models Satz also zu [{}] führt {} vorbei, das ist nicht das, was Sie wollen. Wenn Sie den Server nicht steuern können, können Sie die Überprüfung für {} in einer benutzerdefinierten .parse() Methode durchführen, die [] zurückgibt, wenn es gefunden wird.

+0

Vielen Dank für die detaillierte Erklärung! – Hellnar

7

Wir brauchten einen Weg zu sagen, ob die Beziehung eines RelationalModels abgerufen wurde oder nicht. Das ist unsere Lösung (in Coffeescript).

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

Ich weiß, diese Frage wurde bereits beantwortet, aber hier ist eine Alternative.

Der Hauptvorteil davon ist, dass wir die "When" -Funktion verwenden. Die "When" -Funktion gibt uns die Möglichkeit, mehrere Abrufaufrufe zu überprüfen und einen Erfolg zu erzielen.

Wenn wir das verzögerte Objekt in einer Variablen gespeichert haben, können wir auch so etwas tun. Die Variable wird ein Flag sein, um uns mitzuteilen, dass wir die Daten bereits geladen haben.

Wenn wir fetch() für eine Auflistung aufrufen, wird ein verzögertes jQuery-Objekt zurückgegeben.Ein verzögertes jQuery-Objekt kann sich in drei Zuständen befinden: "ausstehend", "zurückgewiesen" oder "aufgelöst". Sobald wir die Daten haben, wird der Status des verzögerten Objekts aufgelöst.

Verwandte Themen