2015-05-28 4 views
2

Я нахожусь в процессе обучения Backbone JS. Хотя я чувствую, что до сих пор делал отличный процесс, я не понимаю одну вещь.Backbone JS: Откуда возникает параметр, представляющий модель в представлении коллекции?

принимает следующий вид коллекции:

App.Views.Tasks = Backbone.View.extend({ 
    tagName: 'ul', 
    render: function() { 
    this.collection.each(function(a) { 
     var taskView = new App.Views.Task({model: a}); 
     this.$el.append(taskView.render().el); 
    }, this); 
    return this; 
    } 
}); 

Там, параметр a представляет собой объект, который используется для создания единого представления. Но откуда этот параметр?

Конечно, я знаю, что он исходит из коллекции, переданной этому представлению, но откуда он свободен - где определено/документировано, что этот параметр доступен?

ответ

2

В основном вы спрашиваете о том, как работает _.each в библиотеке утилиты underscore.

Он выполняет итерацию по каждому элементу в коллекции и передает его функции обратного вызова. И в этом коде вы устанавливаете каждый элемент в коллекции как модель для App.Views.Task и добавляете ее в элемент пользовательского интерфейса, а затем возвращаете элемент.

underscore является зависимостью от базовой линии, а документация each может быть найдена here.

+0

Итак, вы имеете в виду, что в моем коде 'a' (или какое бы имя оно не указано) доступно, потому что функция' each' underscore прошла его? – Sven

+0

'a' на самом деле элемент в вашей коллекции. Лучшим именем для этого параметра может быть 'task' или' item' или 'itemInCollection'. Функция обратного вызова будет вызвана для каждого элемента в коллекции. Итак, да, функция 'each' передает ее на обратный вызов! :) –

+1

Спасибо, теперь я это понимаю! Довольно просто на самом деле! – Sven

0

each - это метод подчёркивания. Он принимает обратный вызов - анонимную функцию, которая в данный момент принимает значение a. На самом деле этот параметр можно назвать чем угодно. Он представляет конкретный элемент этого массива, который мы итерируем, на каждой конкретной итерации. Обычно я хочу дать ему имя elem или value. Более длинная версия может быть чем-то вроде TheElementOfThisCollectionWeAreCurrentlyIteratingOver.

Если вы должны были использовать цикл вместо этого, ваш код будет выглядеть следующим образом:

for (var i = 0; i < this.collection.length; i++) { 
    var taskView = new App.Views.Task({model: this.collection[i]}); 
    this.$el.append(taskView.render().el); 
} 
+0

'each' не является прототипом метода массива в этом контексте. Это функция утилиты 'underscore'. –

+1

Благодарим вас за разъяснение –

0

Посмотрите на этой линии снова:

this.collection.each(function(a) { 

each вызывает функцию против каждой модели в коллекции , a определяется как первый параметр метода и будет представлять конкретную модель.

Смежные вопросы