Костяк js.слушать и на
каковы преимущества и недостатки следующих 2 строк кода? Я не понимаю, почему есть 2 разных способа сделать то же самое.
this.listenTo(app.Todos, 'change:completed', this.filterOne);
app.Todos.on('change:completed', this.filterOne);
также при использовании .on, Как определить, является ли контекст по умолчанию?
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
доступны альтернативы ECMAfunction.bind
- для основных видов, делать
this.bindAll('onClick', ...)
гарантирует, что экземпляр представления являетсяthis
условиях, когда любые методы представления используются в качестве обработчиков событий- любые мероприятия, связанные с использованием стандартного представления
events
свойство автоматически привязывается к экземпляру представления по позвоночнику (это пояс и подтяжки сbindAll
)Итак, чтобы подвести итог в некоторых руководящих принципах:
- использовать
events
свойство, когда это возможно, как это лаконично и правильно- использовать
this.listenTo
для всех привязок к моделям и коллекциям- любые дополнительные привязки не забудьте надежно привязать контекст, используя предпочтительный метод. Я обычно использую ECMA
Function.bind
потому что эй, стандарты, но есть несколько хороших вариантов.
С
listenTo
объект, события которого вы хотите слушать передается в качестве первого аргумента. В случаеon
, это на самом деле метод в этом объекте.преимущества
listenTo
overon
являются:
слушатель отслеживает все обработчики событий, что делает его легче удалить их все сразу, когда это необходимо.
контекст обратного вызова всегда устанавливается на сам прослушиватель.