#backbone.js #underscore.js
#backbone.js #underscore.js
Вопрос:
В todo demo от backbone есть несколько мест, где _.bindAll(this,...)
используется код. В частности, это используется в initialize
функции обоих представлений. Насколько я могу судить, необходимо сделать следующее:
this.$('.todo-content').text(content);
Но зачем кому-то хотеть делать вышеупомянутое, когда можно сделать:
$('.todo-content').text(content);
?
Ответ №1:
_.bindAll( this, ... )
необходимо не только для this.$( selector ).doSomething()
, но и вообще, чтобы быть уверенным, что this
в вашем представлении метод всегда указывает на само представление.
Например, если мы хотим обновить наше представление при изменении модели, мы привязываем render
метод представления к change
событию модели:
initialize: function() {
this.model.bind( 'change', this.render );
},
Без этого _.bindAll( this, 'render' )
, когда изменения модели this
в render
будут указывать на модель, а не на представление, поэтому у нас не будет ни this.el
ни this.$
каких-либо других доступных свойств представления.
Ответ №2:
Начиная с версии Backbone 0.5.2, больше нет необходимости использовать _.bindAll(this …) в ваших представлениях для задания контекста функций обратного вызова «bind», поскольку теперь вы можете передать 3-й аргумент в bind(), который установит контекст (т. Е. «это») обратного вызова.
Например:
var MyView = Backbone.View.extend({
initialize: function(){
this.model.bind('change', this.render, this);
},
render: function(){
// "this" is correctly set to the instance of MyView
}
});
Комментарии:
1. Строка «this.model.bind(‘change’, this.render, this)» просто заставляет мою голову кружиться >.<
2. Попробуйте coffeescript и его оператор =>.
3. Обратите внимание, что
this.bind
(илиthis.model.bind
) делают совершенно другое, чем_.bind
. Мне потребовалось некоторое время, чтобы осознать.4. @JonatanLittke верно, привязки к магистрали являются псевдонимом для ‘on’
5. это не рекомендуется — более рекомендуется использовать this.listenTo(this.model,’change:id’,this.render); потому что тогда прослушиватели будут удалены, когда вы уничтожите представление
Ответ №3:
this.$
ограничивает контекст jQuery элементом представления, поэтому операции выполняются быстрее.
Кроме того, this.$('.todo-item')
не будет найдено ваших элементов с todo-item
классом вне элемента вашего представления.