Подтвердить что ты не робот

Почему bindAll в представлениях backbone.js?

В главной todo demo в коде есть несколько мест, где используется _.bindAll(this,...). В частности, он используется в функции initialize для обоих представлений. Насколько я могу судить, необходимо сделать следующее:

this.$('.todo-content').text(content);

Но зачем нужно делать выше, когда это можно сделать:

$('.todo-content').text(content);

?

4b9b3361

Ответ 1

this.$ ограничивает контекст jQuery для элемента view, поэтому операции выполняются быстрее.

Дополнительно, this.$('.todo-item') не будет находить ваши элементы с классом todo-item вне вашего элемента вида.

Ответ 2

_.bindAll( this, ... ) необходим не только для this.$( selector ).doSomething(), но в целом, чтобы убедиться, что this в вашем методе просмотра всегда указывает на само представление.

Например, если мы хотим обновить наше представление при изменении модели, мы привязываем метод view render к событию модели change:

initialize: function() {
    this.model.bind( 'change', this.render );
},

Без _.bindAll( this, 'render' ), когда изменение модели this в render будет указывать на модель, а не на представление, поэтому у нас не будет ни this.el, ни this.$, либо каких-либо других свойств представления доступны.

Ответ 3

По сравнению с Backbone 0.5.2 вам больше не нужно использовать _.bindAll(this...) в ваших представлениях, чтобы установить контекст функций обратного вызова bind, так как теперь вы можете передать третий аргумент для привязки(), который установит контекст (т.е. "this") обратного вызова.

Например:

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
  }
});