Коллекция backbone.js получить Vars - PullRequest
16 голосов
/ 10 мая 2011

Это кажется очевидным, но мне как-то не хватает этого ...

Как отправить параметры вместе с коллекцией fetch () backbone.js?

Или, с более широкой точки зрения: у меня на сервере большой набор данных, в данном случае сообщения, которые я хочу сделать доступными через коллекцию. Ввиду того, что могут быть тысячи сообщений, я не хочу просто извлекать и хранить их все одновременно, поэтому моя коллекция должна была бы по крайней мере понимать ограничения и смещения. Не говоря уже о запросах отфильтрованных или отсортированных списков.

Является ли коллекция магистралей даже способом справиться с этим?

Приветствия

Ответы [ 4 ]

31 голосов
/ 26 августа 2011

Я уже несколько дней работаю с Backbone, и мне пришлось почти сразу же заняться этой проблемой, и я посмотрел на это решение, но нашел его неуклюжим.Прочитав еще несколько базовых документов, я обнаружил, что вы можете переопределить любой из параметров jQuery.ajax в методе fetch ().Например,

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

Теперь, когда вы хотите вызвать fetch, просто отправьте ему любые параметры, которые вы пожелаете.например,

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

Это приведет к следующему запросу:

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

В любом случае, я знаю, что вы уже приняли ответ, но, надеюсь, это кому-нибудь поможет.

6 голосов
/ 28 мая 2011

Рассмотрим этот код, когда при создании экземпляра вашей коллекции вы передаете настройки для ее смещения, ограничения или сортировки. Инициализация принимает значения по умолчанию, если предпочтения не предоставлены. А затем функция URL добавляет их в вызов на сервер. После этого вам придется потенциально обновлять эти значения (возможно, только смещение) при обработке ответов от сервера.

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'

});
1 голос
/ 10 мая 2011

Вы можете добавить идентификатор в URL, который может использоваться сервером для выбора отправляемых данных.Например,

    var EventsCollection = Backbone.Collection.extend({

        model: Events,

    });

    var eventCollection = new EventsCollection();
    eventsCollection.url = 'foo?offset=10&limit=20';
    eventsCollection.fetch();
0 голосов
/ 10 мая 2011

Переопределите функцию "url" вашей коллекции и добавьте параметры (? Param = xyz).

Можно также использовать параметр options fetch, так как он передается в последний вызов jQuery ajax.Поэтому, если вы добавите параметр «data», он будет использован.

...