我有自定义的XBL控件,比方说:
<fr:my-control id="my-control-id" attr1 = "value1 value2 value3" attr2 = "aaa" ../>
在我的XBL中,我将处理程序和attr1定义为xf:select
<xbl:handlers>
<xbl:handler event="my-custom-event" phase="target">
<xf:send submission="my-submission"/>
</xbl:handler>
...
<xf:select ref="@subOn">
在dialog.control.details
我添加了:
<xf:select appearance="full" ref="if ($xforms-control/self::xf:select) then $bound-node else ()">
<xf:label>Send submission:</xf:label>
<xf:item>
<xf:label>On load</xf:label>
<xf:value>load</xf:value>
</xf:item>
<xf:item>
<xf:label>On save</xf:label>
<xf:value>save</xf:value>
</xf:item>
</xf:select>
因此,我可以通过点击控件设置中的复选框来选择load
和save
。
现在,我想在attr1
包含特定单词f.e。
<fr:my-control id="my-control-id" attr1 = "save" attr2="...">
if(contains(normalize-space($attr1), 'save') then
<xf:dispatch ev:event="my-custom-event" observer="fr-form-model" name="my-custom-event"
targetid="my-control-id"/>
</fr:my-control>
我该怎么做? 提前谢谢。
更新
我想让自己完全清楚,所以:
1 在表单构建器中生成的表单中,我有:
<fr:my-control id="my-control-id" attr1 = "save">
<xf:dispatch ev:event="my-custom-event" observer="fr-form-model" name="my-custom-event"
targetid="my-control-id"/>
</fr:my-custom-control>
当用户点击Form Runner中的“保存”按钮时,我将此<xf:dispatcher>
置于捕获事件中。 targetid
还有一个问题,我必须手动设置与fr:my-custom-control
相同,但还有另一个问题有自己的帖子。
2 在XBL文件中我有定义处理程序
<xbl:handlers>
<xbl:handler event="my-custom-event" phase="target">
<xf:send submission="my-submission"/> </xbl:handler>
</xbl:handlers>
<xf:input ref="@attr1"/>
此处理程序捕获my-custom-event
并随后发送my-submission
。它在OUTSIDE xbl:template。
3 我想仅在attr1 = "save"
时发送此类提交。
我试着这样做:
<xf:template>
<xf:var name="attr1" xbl:attr="xbl:text=attr1" >
<xf:action ev:event="xforms-enabled xforms-value-changed">
<xf:setvalue ref="instance('attr1')" value="$attr1"/>
</xf:action>
</xf:var>
<xf:model>
<xf:instance id="attr1"><value/></xf:instance>
<xf:group ref=".[contains(normalize-space($subOn), 'save')]">
<xf:submission id="my-submission" ..
..
</xf:submission>
</xf:group>
</xf:model>
这样就不会发送提交。 此外,我只尝试向提交添加条件,如下所示:
<xf:submission id="my-submission"
if="contains(normalize-space($attr1), 'save')"
...>
</xf:submission>
具有讽刺意味的是,无论attr1
实际是什么,这种方式始终都会发送。
它不起作用,我不明白为什么。代码似乎是正确的,但显然肯定存在错误。
答案 0 :(得分:0)
从XForms,您无法访问DOM中其他元素的值,因此在这种情况下,您无法从“外部”fr:my-control
访问其attr1
属性的值。另一方面,XBL组件的实现当然可以访问其属性的值。最简单的方法是在XBL控件内部声明一个变量,例如:
<xf:var name="attr1-attribute" xbl:attr="xbl:text=attr1"/>
然后,您可以在控件$attr1
内使用attr1
属性的值。您是否可以在XBL组件中移动该逻辑,即仅在xf:send
时执行$attr1 = 'save'
?