В новой документации для Polymer 2.0 (https://www.polymer-project.org/2.0/docs/devguide/events#imperative-listeners), он дает следующий пример:
ready() {
super.ready();
this.addEventListener('click', e => this._myClickListener(e));
}
добавить прослушиватель событий в обязательном порядке. Если вы хотите удалить слушателя, нам нужно будет сделать следующее (согласно документам):
constructor() {
super();
this._boundListener = this._myLocationListener.bind(this);
}
connectedCallback() {
super.connectedCallback();
window.addEventListener('hashchange', this._boundListener);
}
disconnectedCallback() {
super.disconnectedCallback();
window.removeEventListener('hashchange', this._boundListener);
}
Это имеет смысл для меня на поверхности; нам нужно убедиться, что одна и та же ссылка на функцию передается как для удаления, так и для добавления прослушивателя событий, поскольку именно так он индексирует разные прослушиватели.
Однако, почему мы должны использовать .bind(this)? Я понимаю, что он возвращает новую функцию, которая привязывает функцию к тому, чем является «это», поэтому полезно создать новую ссылку на сохраненную функцию, чтобы мы могли добавлять и удалять одну и ту же ссылку на функцию.
Но почему мы не можем сделать это с первым примером? Разве this._myClickListener(e) в первом сегменте кода также не имеет уникальной ссылки на функцию, которая не меняется, на которую мы можем ссылаться для добавления и удаления прослушивателя? Зачем нам вообще нужно оборачивать его в анонимную функцию? Я чувствую, что это решило бы проблему, которая была подробно решена во втором сегменте кода, но это явно сделано не просто так.
Спасибо за любую помощь или предложения заранее!