Извлекать данные с разных URL-адресов, используя одну и ту же коллекцию в backbone js.


comment
Я столкнулся с той же проблемой, что и сейчас, - это успех одной выборки, я обновил URL-адрес и снова получил, но оказалось, что он обновляет всю мою коллекцию   -  person kishanio    schedule 07.12.2012


Ответы (2)


Я думаю, что способ состоит в том, чтобы переопределить fetch, где вы делаете вызов Ajax для каждого из API. Сохраните возвращенные частичные наборы во временном массиве, и когда все 4 будут завершены, создайте коллекцию, используя this.reset. (Я полагаю, вы могли бы использовать JQuery Deferred или просто вести внутренний подсчет количества возвращенных вызовов.)

Что-то вроде этого:

var Collection = Backbone.Collection.extend({

    fetch: function() {
        this.completeCount = 0;
        this.errorCount = 0;
        this.temp = [];
        this.urls = [ 'url1', 'url2', 'url3', 'url4' ];
        var self = this;

        // make a $.get call for each URL and add
        _.each(this.urls, function(url) {
            $.get(url, { success: function(data) {
                console.log("Got partial collection from " + url);
                self.addPartial(data);

                // alternatively, just call "self.add(data);" here

            }, error: function(response) {
                console.log("Oops, the Ajax call failed for some reason... ignoring");
                self.completeCount ++;
                self.errorCount ++;
            } });
        });
    },

    // add a JSON array that contains a subset of the collection
    addPartial: function(data) {
        this.completeCount ++;
        var self = this;    

        // add each item to temp
        _.each(data, function(item) {
            self.temp.push(item);   
        });

        // if all have been received, then create the collection
        if (this.completeCount == this.urls.length) {
            this.reset(this.temp);
        }
    }
});

Вот Fiddle, где я заменил $.get методом, который просто возвращает фиктивные данные после небольшой задержки.

Ответ на комментарий

Добавлять ответы в коллекцию по мере их поступления, вероятно, лучше (в любом случае это проще). Вот обновленный Fiddle.

person McGarnagle    schedule 06.12.2012
comment
Но есть какой-то метод, с помощью которого мы можем добавлять модели непосредственно в коллекцию. В любом случае мы можем продолжать добавлять ее к той же самой после каждой другой обычной выборки? - person kishanio; 07.12.2012
comment
@KishanTobhani да, абсолютно. Вы можете использовать collection.add(data), где данные — это массив. Это просто зависит от того, как вы хотите, чтобы события запускались — мой способ выше вызовет одно событие reset, а ваше предложение вызовет 4 события add. - person McGarnagle; 07.12.2012
comment
Спасибо, но у меня была немного другая проблема, я пытался сделать это, но все глючило. можете ли вы взглянуть на это stackoverflow.com/questions/13753540/ - person kishanio; 07.12.2012
comment
@KishanTobhani, поэтому вам нужно переопределить функцию fetch. Метод fetch по умолчанию всегда будет очищать и заново создавать коллекцию. - person McGarnagle; 07.12.2012
comment
Умм, хорошо, дай мне попробовать. Спасибо - person kishanio; 07.12.2012
comment
@KishanTobhani ах, извините, я ошибся ... см. ответ Эндрю Хаббса на другой ваш вопрос. Я думаю, вы можете указать Backbone добавить, а не сбрасывать всю коллекцию. - person McGarnagle; 07.12.2012

Я знаю, что это старый вопрос, но если кто-то доберется сюда, эта информация может помочь. Чтобы сохранить данные, ранее полученные коллекцией, вы можете изменить URL-адрес и вызвать метод fetch() в любое время с помощью следующих параметров:

reset: false,
remove: false,

Так

yourCollection.fetch({reset: false, remove: false, [other]: [wathever]})

И все, нет необходимости переопределять метод. (Может быть, в 2012 году это было необходимо, не знаю. Дело в том, что эти опции работают для Backbone 1.1.2 и выше). Имейте в виду, что я не уверен, что это объединит или просто добавит новые данные, даже если они повторяются.

Документация (http://backbonejs.org/#Collection-fetch) немного сбивает с толку. вариант 'reset', поскольку он говорит, что по умолчанию установлен false, возможно, это может применяться только тогда, когда URL-адрес остается статическим и единственным.

person Josué Martín Hernández    schedule 17.11.2016