Костяк 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, это на самом деле метод в этом объекте.преимущества
listenTooveronявляются:
слушатель отслеживает все обработчики событий, что делает его легче удалить их все сразу, когда это необходимо.
контекст обратного вызова всегда устанавливается на сам прослушиватель.