Итерация по Backbone.PageableCollection не работает
У меня есть Backbone.PageableCollection (@customers
) чьи модели я хотел бы повторить. Я перепробовал много вещей, включая то, что я считал очевидным:
@customers.each (customer) ->
console.log customer
К сожалению, это выдает что-то похожее на коллекцию, но в нем нет данных модели. Я знаю, что коллекция была полностью синхронизирована, потому что когда я выхожу @customers.models
Я могу увидеть массив данных модели:
Странно, если я сделаю это:
_.each @customers.models, (customer) ->
console.log customer
Я получаю такой же бесполезный результат, как указано выше.
Что мне не хватает?
Обновить:
Присмотревшись к объекту, зарегистрированному console.log customer
в обоих подходах это выглядит как модель с ненаселенными атрибутами. Это странно с тех пор @customers.models
показывает массив моделей с полностью заполненными атрибутами. В дополнение each
цикл выполняется только один раз.
Обновление 2:
Я попробовал следующее в соответствии с предложением Агконти ниже:
@customers.each (@customers, c) ->
console.log @customers, c
который компилируется в:
return this.customers.each((function(_this) {
return function(customers, c) {
_this.customers = customers;
return console.log(_this.customer, c);
};
})(this));
и журналы undefined
и 0
,
Обновление 3:
Если я установлю:
window.customers = @customers
и затем введите это в консоли:
_.each(customers.models, function (customer) { return console.log(customer)});
Я получаю журнал всех моделей клиентов. Я действительно смущен сейчас...
Обновление 4:
Я сузил это до проблемы времени. Я запускаю этот код после синхронизации коллекции, но кажется, что анализ модели в коллекции происходит позже.
3 ответа
Это оказалось некоторой проблемой в моем коде получения / синхронизации. Этот код не должен выполняться до тех пор, пока коллекция клиентов не будет полностью синхронизирована, но что-то (пока не определенное) позволяет ему работать до полной синхронизации коллекции.
Вам нужно указать итератор для .each()
, Сделайте это вместо этого:
@customers.each (@customers, c) ->
console.log c
Если вы проверите документацию по магистрали на .each()
Вы видите, что он принимает три свойства; (list, iterator, [context])
, Поскольку вы просто регистрируете клиента, а не итератор коллекции клиентов, она просто регистрирует всю коллекцию.
Модели магистральной коллекции хранятся в Collection.models
Это то, что вам нужно перебрать. когда делаешь _.each @customers
вы перебираете атрибуты объекта коллекции, а не его модели, так что вы хотите_.each @customers.models, (customer) -> console.log customer