XBL控件的属性

时间:2015-01-26 15:54:14

标签: orbeon

我有自定义的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>

因此,我可以通过点击控件设置中的复选框来选择loadsave。 现在,我想在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实际是什么,这种方式始终都会发送。

它不起作用,我不明白为什么。代码似乎是正确的,但显然肯定存在错误。

1 个答案:

答案 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'