Ответ Джесси - один из двух подходящих подходов к этому. Другой подход - отправить CustomEvent
из вашего пользовательского элемента и подписаться на него из представления, которое использует пользовательский элемент.
Внутри multiselect-dropdown.js
:
// without your JS it's hard to assume what you need, but here's the gist of it
// assuming this method is called in some way in response to a change
onSelectionChanged() {
const detail = {
component: this, // include whatever information the consuming view needs
};
const event = new CustomEvent('select', { bubbles: true, detail });
this.el.dispatchEvent(event); // assuming this.el is the injected Element instance
}
В edit-user.html
:
<multiselect-dropdown select.trigger="handleSelect($event)">
</multiselect-dropdown>
В edit-user.js
:
handleSelect($event) {
const detail = $event.detail;
// do stuff with detail.component or whichever info you included
return false; // stops the event from bubbling further up
}
Как видите, с точки зрения .call
по сравнению с отправкой настраиваемого события, они во многом совпадают с точки зрения того, какие проблемы вы можете с ними решить.
Мое личное предпочтение для вызовов, которые происходят от событий DOM, состоит в том, чтобы сохранять их как события. Это позволяет вам приблизиться к естественному способу работы с HTML, когда вам нужно передать изменения дальше по дереву DOM.
.call
, с другой стороны, приводит к уменьшению количества создаваемых объектов и слушателей и может привести к повышению производительности (в частности, к уменьшению использования памяти) в очень больших приложениях. Это также дает вам меньше беспокойства с точки зрения очистки / отмены распространения и тому подобного.
У обоих есть свое время и место, используйте то, что имеет смысл в вашей ситуации.