我有一个像这样的Hyperstack组件:
render do
LI(class: class_names, title: conflicts || '',
data: { toggle: :tooltip, placement: 'auto left', container: :body }) do
DIV(class: 'row paper-row') do
DIV(class: 'col-sm-12 text-left') do
P(class: 'medium-weight', id: 'tp_envelopes') { params.envelope.name }
end
end
end.on(:click) { select_envelope }
end
如果conflicts
方法返回非零值,我希望on(:click)处理程序是有条件的。
我也想知道如何在hyperspec / capaybara中测试这个...即如何检查html元素是否响应:click事件?
您可以使用有条件地关闭/打开单击处理程序
end.tap { |item| item.on(:click) { select_envelope } unless conflicts }
取代
end.on(:click) { select_envelope }
end.on(:click) { select_envelope }
你可以用以下代码替换(:click)
:
(!conflicts && :click)
这是有效的,因为如果冲突不是nil,这将导致零点击处理程序不执行任何操作。
由于事件冒泡,我不确定检查单击事件的元素是否可靠。
我会编写测试来单击元素,然后期望click事件中的任何逻辑都不会发生。
conflicts = true
element.click() # trigger select_envelope
expect(selected_envelope).to be_nil # no envelope should be selected due to conflicts
保持代码清洁的一个好方法就是返回事件中调用的方法:
def select_envelope
return if conflicts
...
end
# this keeps the event handler the same
end.on(:click) { select_envelope }
由于不得不总是触发事件,因此性能可以忽略不计,但总会出现性能与可读性的争论。