Костяк js.слушать и на


каковы преимущества и недостатки следующих 2 строк кода? Я не понимаю, почему есть 2 разных способа сделать то же самое.

this.listenTo(app.Todos, 'change:completed', this.filterOne);
app.Todos.on('change:completed', this.filterOne);

также при использовании .on, Как определить, является ли контекст по умолчанию?

2 63

2 ответа:

listenTo является более новым и лучшим вариантом, потому что эти слушатели будут автоматически удалены для вас во время stopListening который вызывается при удалении представления (через remove()). До listenTo была действительно коварная проблема с фантомными представлениями, висящими вокруг навсегда (утечка памяти и вызывающая неправильное поведение), потому что методы представления ссылались как слушатели событий на моделях, хотя сами экземпляры представления давно исчезли и больше не находятся в DOM.

если вы хотите прочитать предысторию для listenTo, поиск в магистральном репозитории github для listenTo и прочитайте некоторые из более длинных обсуждений вопроса.

что касается контекста по умолчанию, несколько вещей могут быть привязаны к this:

  • если вы делаете привязку через this.listenTo, это всегда будет экземпляр представления (указанный Wim Leers в комментариях)
  • без this.listenTo история усложняется
    • для различных событий, это будет глобальный объект (лучше всего этого избежать)
    • для событий DOM это будет исходный элемент, как и в обычной привязке событий DOM
    • если вы предоставляете явный контекст (3-й аргумент для foo.on), позвоночник будет использовать это (таким образом, это более надежный подход)
    • если вы используете стандарт ECMA function () {//your event handler}.bind(this), вы также можете вручную управлять контекстом (также рекомендуется)
    • как указал @mu,_.bind или $.proxy доступны альтернативы ECMA function.bind
    • для основных видов, делать this.bindAll('onClick', ...) гарантирует, что экземпляр представления является this условиях, когда любые методы представления используются в качестве обработчиков событий
  • любые мероприятия, связанные с использованием стандартного представления events свойство автоматически привязывается к экземпляру представления по позвоночнику (это пояс и подтяжки с bindAll)

Итак, чтобы подвести итог в некоторых руководящих принципах:

  • использовать events свойство, когда это возможно, как это лаконично и правильно
  • использовать this.listenTo для всех привязок к моделям и коллекциям
  • любые дополнительные привязки не забудьте надежно привязать контекст, используя предпочтительный метод. Я обычно использую ECMA Function.bind потому что эй, стандарты, но есть несколько хороших вариантов.

С listenTo объект, события которого вы хотите слушать передается в качестве первого аргумента. В случае on, это на самом деле метод в этом объекте.

преимущества listenTo over on являются:

  • слушатель отслеживает все обработчики событий, что делает его легче удалить их все сразу, когда это необходимо.

  • контекст обратного вызова всегда устанавливается на сам прослушиватель.