5

我有一个这样的 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 事件?

4

4 回答 4

3

您可以使用有条件地关闭/打开点击处理程序

end.tap { |item| item.on(:click) { select_envelope } unless conflicts }

取代

end.on(:click) { select_envelope }
于 2019-04-11T14:22:08.707 回答
2
end.on(:click) { select_envelope }

您可以替换(:click) 为:

(!conflicts && :click)

这是有效的,因为如果冲突不是零,这将导致一个不做任何事情的零点击处理程序。

于 2019-04-11T14:47:41.997 回答
1

保持代码干净的一个好方法是在事件中调用的方法中返回:

def select_envelope
  return if conflicts

  ...
end

# this keeps the event handler the same
end.on(:click) { select_envelope }

必须总是触发事件对性能的影响可以忽略不计,但总是存在性能与可读性的争论。

于 2019-04-11T18:52:11.697 回答
1

由于事件冒泡,我不确定检查元素的点击事件是否可靠。

我会编写测试来单击元素,然后期望单击事件中的任何逻辑都不会发生。

conflicts = true

element.click() # trigger select_envelope

expect(selected_envelope).to be_nil # no envelope should be selected due to conflicts
于 2019-04-11T15:15:07.653 回答