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

#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 классом вне элемента вашего представления.