Я открываю для себя EmberJS и начал мигрировать существующий веб-сайт в эту среду.У меня была проблема с выпадающим списком на основе Bootstrap.Эта проблема на самом деле помогла мне понять концепции Эмбер немного лучше, но у меня все еще есть некоторые вопросы.
Я использовал модуль ember-bootstrap для создания этого раскрывающегося списка (среди прочего), и вот чтокод должен быть:
{{#bs-dropdown as |dd|}}
{{#dd.button}}
Sort by
{{/dd.button}}
{{#dd.menu as |ddm|}}
{{#ddm.item}}{{#ddm.link-to "index"}}Price low to high{{/ddm.link-to}}{{/ddm.item}}
{{#ddm.item}}{{#ddm.link-to "index"}}Price high to low{{/ddm.link-to}}{{/ddm.item}}
{{/dd.menu}}
{{/bs-dropdown}}
Теперь я хочу, чтобы какой-нибудь код JavaScript выполнялся, когда пользователь нажимает на один из элементов.После проверки документации модуля я нашел, где был определен компонент меню , и отредактировал его код следующим образом:
export default Component.extend({
layout,
classNameBindings: ['containerClass'],
/* ... */
actions: {
// My addition
sortByPrice(param){
alert("sorting");
},
// End of the addition
toggleDropdown() {
if (this.get('isOpen')) {
this.send('closeDropdown');
} else {
this.send('openDropdown');
}
},
},
});
Затем я обновил файл hbs какследует:
{{#dd.menu as |ddm|}}
{{#ddm.item action "sortByPrice" low_to_high}}
{{#ddm.link-to "index" action "sortByPrice" low_to_high}}
Prix croissant
{{/ddm.link-to}}
{{/ddm.item}}
{{/dd.menu}}
Это не сработало, и именно поэтому вы добавили *action*
к элементу link-to
и аналогичным образом объявили действие над его файлом компонента.
import LinkComponent from '@ember/routing/link-component';
export default LinkComponent.extend({
actions: {
sortByPrice(param){
alert("sorting");
console.log("sorting");
},
},
});
Как видите, компонент *link-to*
расширяет компонент LinkComponent .В конце концов я понял, что этот элемент не может обрабатывать события щелчка по умолчанию, как объяснено в этой теме .
Из-за разочарования я получил менее элегантный подход, который до сих поруловка:
{{#bs-dropdown id="sort" as |dd|}}
{{#dd.button}}
Sort by
{{/dd.button}}
{{#dd.menu as |ddm|}}
{{#ddm.item action "sortByPrice" low_to_high}}
<a
class="dropdown-item"
onclick="sortByPrice('low_to_high'); return false;"
href="#"
>
Price low to high
</a>
{{/ddm.item}}
{{/dd.menu}}
{{/bs-dropdown}}
Теперь вот мои вопросы:
- Почему определение действий как для файла компонентов, так и для hbs one не изменило результат?
- Почему LinkComponent не обрабатывает события щелчка по умолчанию?Я понимаю, что ссылка должна перенаправлять пользователей на новую страницу (которая до сих пор спорно), но событие DOM еще уволят, так же Ember намеренно игнорировать его и выбрать, чтобы не позволить разработчикам справиться с этим?Я хочу знать логику этого.
- Есть ли лучший подход, чем мое решение?
Спасибо.