Backbone.js: _.bindAll() в инициализации - почему это используется?
Я рассматривал некоторые примеры приложений на основе backbone.js. Я заметил, что в некоторых (например, этот пример ниже) используется функция подчеркивания _.bindAll()
:
initialize: function (args) {
_.bindAll(this, 'changeTitle');
this.model.bind('change:title', this.changeTitle);
},
тогда как в других (например, приложение todo ниже) не:
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.remove, this);
},
В чем смысл _.bindAll()
в этом контексте и нужно ли это?
Ответы
Ответ 1
_.bindAll()
изменяет this
в названных функциях, чтобы всегда указывать на этот объект, чтобы вы могли использовать this.model.bind()
. Обратите внимание, что во втором примере третий аргумент передается bind()
; поэтому использование _.bindAll()
не требуется в этом случае. В общем, это хорошая идея использовать для любых методов на модели, которые будут использоваться в качестве обратных вызовов для событий, чтобы вы могли легче ссылаться на this
.
Ответ 2
In Detail: _.bind(ctx, 'method')
Принимает ваш метод, создает копию с контекстом, связанным с 'ctx', и добавляет свойство copy как.
Это обходное решение для jQuery.bind()
, не позволяющее вам перейти в контекст.
JQ всегда будет вызывать обратные вызовы с контекстом undefined. Магистраль построена на jQuery.
Смотрите здесь: http://backbonejs.org/#FAQ-this