删除鞋子中的事件

时间:2009-03-08 18:26:11

标签: ruby events shoes

有什么方法可以删除鞋子中的事件?我搜索了许多网站和参考文献,但我找不到任何方法来删除一个事件...我发现我需要创建自己的事件管理器...它真的是必要的吗?或者有办法去除事件监听器?

4 个答案:

答案 0 :(得分:2)

我发现Shoes只允许在给定事件上使用单个侦听器方法,因此您可以通过调用事件而不是将块传递给它来删除先前的侦听器。

例如,此鞋子应用程序将在单击一次后清除点击事件。如果您删除了阻止内部点击的呼叫,则会反复触发。

Shoes.app
  @p = para "Empty"
  @click_count = 0
  click do |b,x,y| 
    @click_count += 1
    @p.replace "Clicked #{@click_count} time(s)."
    click # remove the click handler
  end
end

答案 1 :(得分:1)

您要删除哪些键绑定? Shoes应用程序上的所有事件或仅是默认绑定?

如果要覆盖为“alt- /”,“alt-。”,“alt-?”等鞋子保留的绑定,请将以下代码粘贴到包含应用程序代码的文件中

class Shoes::App
  def Shoes.show_log # gets called on alt-/
  end

  def Shoes.show_manual # gets called on alt-?
  end

  def Shoes.show_selector # gets called on alt-.
  end
end

上面的代码猴子修补了鞋子代码,当按下相应的按键时,它们什么都不做。

您可以对其余的默认绑定使用相同的技术。 grep关键绑定的鞋源,找到相应的方法并在应用程序中定义一个空方法来覆盖内置方法。

答案 2 :(得分:0)

您是否尝试过method.unbind(obj)

答案 3 :(得分:0)

您能否通过“删除活动”澄清您的意思?您是想忽略特定事件还是想要“关闭”事件监听器?

如果是前者,我建议写一个忽略该事件的听众。

如果是后者,为什么不让听众的身体以一些外部可访问的值为条件,给自己一个开/关开关。

如果您想要其他内容,请编辑问题以便澄清,稍后我会停止并编辑我的答案。

在回应你的评论时,我会重新提出上述第二种选择。如果你想得到真正的幻想,你可以写下这样的东西:

$keypress_listeners = {}
keypress do |key|
    $keypress_listeners.values.each { |l| l.call(key)
    end
$keypress_listeners[:hero_controller] = lambda { |key| ... }
:
:
$keypress_listeners.delete[:hero_controller]

同样适用于任何其他事件,但这可能是矫枉过正的。另一方面,它可以让您完全控制事件处理。