我有一个像这样的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
方法返回非nil值,我希望on(:click)处理函数为条件。
我还想知道如何在hyperspec / capaybara中对此进行测试...即如何检查html元素是否响应:click事件?
答案 0 :(得分:3)
您可以通过使用
有条件地关闭/打开点击处理程序
class CSV
{
private $handle;
private $file;
function __construct($mode,$file) {
$this->file=$file;
try {
$this->handle = fopen($file, "$mode");
} catch (PDOException $e) {
exit('Error');
}
}
public function getAll()
{
$csv = array();
//metto tutto il file in un'array
$lines = file($this->file);
foreach ($lines as $key => $value)
{
$csv[$key] = str_getcsv($value,";");
}
fclose($this->handle);
return $csv;
}
}
替换
end.tap { |item| item.on(:click) { select_envelope } unless conflicts }
答案 1 :(得分:2)
end.on(:click) { select_envelope }
您可以替换(:click)
与:
(!conflicts && :click)
之所以起作用,是因为如果冲突不是零,则将导致零点击处理程序不执行任何操作。
答案 2 :(得分:1)
由于事件冒泡,我不确定检查click事件的元素是否可靠。
我会编写测试以单击元素,然后期望click事件中的任何逻辑都不会发生。
conflicts = true
element.click() # trigger select_envelope
expect(selected_envelope).to be_nil # no envelope should be selected due to conflicts
答案 3 :(得分:1)
保持代码干净的一种好方法是在事件中调用的方法内部返回:
def select_envelope
return if conflicts
...
end
# this keeps the event handler the same
end.on(:click) { select_envelope }
必须始终触发事件对性能的影响可以忽略不计,但始终存在性能与可读性之间的争论。