我正在发现 EmberJS 并开始将现有网站迁移到此框架。我遇到了基于 Bootstrap 的下拉菜单的问题。这个问题实际上帮助我更好地理解了 Ember 的概念,但我仍然有一些问题。
我使用了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}}
现在这是我的问题:
- 为什么在 Component 文件和 hbs 上定义操作并没有改变结果?
- 为什么 LinkComponent 不原生处理点击事件?我知道一个链接应该将用户重定向到一个新页面(这仍然是有争议的),但是 DOM 事件仍然被触发,那么 Ember 是否故意忽略它并选择不让开发人员处理它?我想知道这背后的逻辑。
- 有比我的解决方案更好的方法吗?
谢谢。