如何使用 on-tap='node_action' 触发元素的点击事件?

How to trigger a tap event for element with on-tap='node_action'?

通常我可以使用 fire 来激活处理程序,但在这种情况下,我需要在事件处理程序中使用 e.context 获取完整的项目数据。


更新 08.05.15

详细说明
为什么我不能开火 node_action?
我有一个项目列表,点击后我想在项目附近的浮动块中显示项目相关信息。 所以我有每个项目 on-tap='node_action' 并且我有:

@on 'node_action', (e)->
  item = e.context — then I can use item.id to load data
  item_div = e.node — then I can use item_div.top_y() to show floating menu
                      on the same level on the page with the item div

为什么需要触发?
如果我想在那个浮动菜单上工作,我不想每次在页面刷新后都手动单击项目,所以我通常使用触发事件来自动执行它。

是的,我可以在这里用准备好的事件开火,比如

e =
  context: ractive.get 'items.0'
  node: ractive.find '.items .line:first'
ractive.fire('node_action', e)

但是可以对列表中的项目进行排序、筛选和更改。

理想情况下,有这样的东西会很好:

ractive.find('.items .line:first').tap()

ractive.find('.items .line:first').trigger 'tap' 

或者也许

ractive.find('.items .line:first').fire 'node_action'

在响应式应用程序中,当您想要获取 DOM 节点来获取数据时,通常表示出现了问题。但没有更多细节很难说。

为了回答我认为是你的问题,你可以使用以下方法从节点获取上下文、键路径和索引,类似于你从事件上下文中获取的内容:

var info = Ractive.getNodeInfo(node);

终于发现 Rich Harris 的 Simulant.js 实际上是可行的。
它不支持 tap 事件,因此根据我的需要,我添加了一个小的 jQuery 插件

# Ractive trigger
# btn.r_trigger 'tap'
# btn.r_trigger 'click', {button:1, which:2}
$.fn.r_trigger = (event_name, opt)->
    el = @[0]
    switch event_name
        when 'tap'
            simulant.fire(el, 'mousedown', opt)
            simulant.fire(el, 'click', opt)
        else
            simulant.fire(el, event_name, opt)