15 Stimmen

backbone.js Sammlung get vars

Das scheint offensichtlich zu sein, aber ich übersehe es irgendwie...

Wie senden Sie Optionen zusammen mit einer backbone.js-Sammlung fetch()?

Oder, von einem breiteren Gesichtspunkt aus betrachtet: Ich habe einen großen Datensatz auf dem Server, in diesem Fall Nachrichten, die ich über eine Sammlung zugänglich machen möchte. Da es sich um Tausende von Nachrichten handeln könnte, möchte ich nicht einfach alle auf einmal abrufen und speichern, also müsste meine Sammlung zumindest Grenzen und Offsets kennen. Ganz zu schweigen von der Abfrage gefilterter oder sortierter Listen.

Ist eine Backbone-Sammlung überhaupt der richtige Weg, um dies zu tun?

Prost

31voto

Ich habe mit Backbone für ein paar Tage jetzt verwirrt und ich hatte mit diesem Problem fast sofort zu tun und ich schaute auf diese Lösung, aber ich fand es klobig. Nachdem ich etwas mehr Backbone-Dokumentation gelesen hatte, entdeckte ich, dass man tatsächlich jede der folgenden Funktionen außer Kraft setzen kann jQuery.ajax Optionen innerhalb der fetch()-Methode. Also zum Beispiel

Posts = Backbone.Collections.extend({
  model: Post,
  url: '/posts'
});

Wenn Sie nun fetch aufrufen möchten, senden Sie ihm einfach die gewünschten Parameter, z. B.

var posts = new Posts();
posts.fetch({ data: { page: 3, pagesize: 10, sort: 'asc' } });

Dies führt zu der folgenden Anfrage:

http://yourdomain/posts?page=3&pagesize=10&sort=asc

Wie auch immer, ich weiß, dass Sie bereits eine Antwort akzeptiert haben, aber ich hoffe, dass dies jemandem helfen wird.

6voto

Bill Eisenhauer Punkte 6163

Betrachten Sie diesen Code, in dem Sie bei der Instanziierung Ihrer Sammlung Präferenzen für den Versatz, das Limit oder die Sortierung angeben. Die Initialisierung übernimmt Standardwerte, wenn keine Einstellungen angegeben werden. Und dann fügt die url-Funktion diese in den Aufruf an den Server ein. Danach müssen Sie diese Werte möglicherweise aktualisieren (wahrscheinlich nur den Offset), wenn Sie Antworten vom Server verarbeiten.

MessageList = Backbone.Collection.extend({

    initialize: function(models, options) {
        options || (options = {});
        this.offset = options.offset || 0;
        this.limit  = options.limit || MessageList.DEFAULT_LIMIT;
        this.sortBy = options.sortBy || MessageList.DEFAULT_SORTBY; 
    },

    url: function() {
        return '/messages?' + 
               'offset=' + encodeURIComponent(this.offset) + '&' +
               'limit=' + encodeURIComponent(this.limit) + '&' + 
               'sort_by=' + encodeURIComponent(this.sortBy);
    },

    parse: function(response) {
       // Parse models
       // Parse offset, limit, sort by, etc
    }

}, {

    DEFAULT_LIMIT: 100,
    DEFAULT_SORTBY: 'name_asc'

});

1voto

donnut Punkte 180

Sie können der URL eine ID hinzufügen, die vom Server verwendet werden kann, um eine Auswahl der gesendeten Daten zu treffen. z.B..

    var EventsCollection = Backbone.Collection.extend({

        model: Events,

    });

    var eventCollection = new EventsCollection();
    eventsCollection.url = 'foo?offset=10&limit=20';
    eventsCollection.fetch();

0voto

Julien Punkte 9216

Überschreiben Sie die Funktion "url" Ihrer Sammlung und fügen Sie die Parameter hinzu (?param=xyz).

Der options-Parameter von fetch kann ebenfalls verwendet werden, da er an den endgültigen jQuery-Ajax-Aufruf weitergegeben wird. Wenn Sie also einen "data"-Parameter hinzufügen, wird dieser verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X