2

有什么方法可以删除鞋子中的事件?我搜索了许多网站和参考资料,但找不到任何删除事件的方法……我介意我需要创建自己的事件管理器……真的有必要吗?或者有办法解除事件监听器?

4

4 回答 4

2

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

例如,这款鞋类应用在点击一次后会清除点击事件。如果您删除块内的click调用,那么它将重复触发。

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
于 2009-04-09T15:10:18.590 回答
1

您要删除哪些键绑定?鞋子应用程序上的所有事件还是只是默认绑定?

如果您想覆盖为鞋子保留的绑定,例如“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 键绑定的鞋子源,找到相应的方法并在您的应用程序中定义一个空方法以覆盖内置方法。

于 2009-04-08T08:18:45.407 回答
0

你试过method.unbind(obj)吗?

于 2009-03-08T18:55:09.697 回答
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]

对于任何其他事件也是如此,但这可能是矫枉过正。另一方面,它可以让您完全控制事件处理。

于 2009-03-08T18:56:00.613 回答