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

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() в этом контексте и нужно ли это?

4b9b3361

Ответ 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