javascript - 在 Ember 中,使用选择标签停止点击事件传播的最佳方法是什么

标签 javascript html ember.js

在 Ember 中,我想要一个父 div,单击该父 div 时将调用一个操作,除非在该 div 中单击选择标签。我最终想出了一个解决方案,但它不是很好,想知道是否有人可以解释为什么 bubbles=false 在这种情况下不起作用,以及我如何访问 selectValue 操作上的事件(详细信息如下)。

最初我有:

<div class="parent-class" {{action 'shouldNotBeCalledOnSelect'}}>
    <select onchange={{action "selectValue" value="target.value"}}>
        <option class="default-option" disabled selected value>-</option>
        {{#each score.range as |valueChoice|}}
            <option value={{valueChoice}} selected={{eq score.value valueChoice}}>{{valueChoice}}</option>
        {{/each}}
    </select>
</div>

但我不希望在单击选择标签时调用“shouldNotBeCalledOnSelect”操作。我在 selectValue 操作上尝试 bubbles=false ,但这不起作用。我想不出一种方法来通过 selectValue 操作传递事件,如果可以的话我可以调用

event.stopPropagation();

通过一个操作,您可以使用以下方式获取事件

onclick={{action 'someAction'}}

然后可以在 Javascript 中检索事件作为最后一个参数。我实现的解决方案有点垃圾,就是在 select 标记上同时具有 onchange 和 onclick 事件,并专门使用 onclick 来停止传播。

<div class="parent-class" {{action 'shouldNotBeCalledOnSelect'}}>
    <select onchange={{action "selectValue" value="target.value"}} onclick={{action 'stopPropagation'}}>
        <option class="default-option" disabled selected value>-</option>
        {{#each score.range as |valueChoice|}}
            <option value={{valueChoice}} selected={{eq score.value valueChoice}}>{{valueChoice}}</option>
        {{/each}}
    </select>
</div>

在 javascript 中我有:

selectValue(value) {
    this.set('score.value', value);
    this.get('score').save();
},

stopPropagation(event) {
    event.stopPropagation();
},

shouldNotBeCalledOnSelect() {
    console.log("CALLED");
}

最佳答案

首先,您需要处理 onclickonchange;因为它们是不同的事件,而冒泡到 div 元素的事件是 onclick。您无法通过阻止 onchange 事件冒泡来阻止 click 事件传播到 div 元素。

其次,kumkanillam 提供的答案将不起作用!看我的twiddle我在其中尝试了 kumkanillam 提出的解决方案以及分别使用 bubbles=false 进行第一次和第二次选择的正确方法。

这就是 Ember 官方 API 中 bubbles=false 不适用于第一个选择而适用于第二个选择的原因。 “要使用闭包样式操作禁用冒泡,您必须创建自己的使用 event.stopPropagation() 的包装器助手”。请参阅documentation了解详情。

总而言之,如果您使用最初发布的情况下的关闭操作,则必须编写一个操作处理程序并调用 event.stopPropagation() 以防止事件冒泡。如果您使用旧式操作助手(旋转中的第二个选择),则 bubbles=false 将起作用。

您可以在以下内容中阅读有关操作助手的更多信息link了解有关 Action 助手的更多信息。

关于javascript - 在 Ember 中,使用选择标签停止点击事件传播的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200899/

相关文章:

javascript - Ember Simple Auth - 如何更新存储的 token

javascript - 使用 node 和 sequelize 插入 postgress 数据库时出现无效的错误

javascript - Node.js 和互斥锁

Javascript:即使我使用的是 window.onload,我也会收到错误 'var is not defined'

javascript - 检测用户是否在圆圈内单击

ember.js - 子路由(或资源)如何从模型 Hook 内访问父资源的模型?

javascript - 无法在 localhost 上启动 Node.js 的 MongoDB

javascript - 保护用户定义的 javascript 函数以保护 node.js 服务器

javascript - 从下拉列表中选择后显示图像

node.js - Express Node 用作支持 pushState 的服务器,服务于任何没有任何路径前缀的静态资源