XPages中的嵌套表达式语言语法

时间:2017-01-28 17:13:35

标签: xpages

我正在重构一个模仿Notes客户端讨论数据库的XPage。 (不要问)

我创建了一个Managed Bean,它将所有导航信息加载到树中,并创建了一组嵌套的重复控件来访问托管bean。

我遇到崩溃和扩展功能的问题。原作者通过访问包含下一级条目的面板来使用客户端JavaScript。他们通过硬编码来做到这一点。 1000行XML,即。

<xp:this.script><![CDATA[collapse("#{id:repeatcontrolpanel3}]}")]]></xp:this.script>

我正在努力使这个通用;我在自定义控件中设置了一个属性 NameNestedRepeatControl ,其中包含我要折叠/展开的嵌套repeatcontrol的名称,我希望这可以工作:

<xp:this.script><![CDATA[collapse("#{id:#{compositeData.NameNestedRepeatControl}}")]]></xp:this.script>

但我得到了

javax.faces.el.MethodNotFoundException: NameNestedRepeatControl: com.ibm.xsp.binding.PropertyMap.NameNestedRepeatControl()

错误。

是否有一种特殊的语法,即从自定义控件的属性中获取字符串值,然后使用#{id:}来评估该字符串,或者是否有一个我更缺失的更优雅的方法? / p>

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我终于在外面构建了必要的脚本来解决这个问题。这里我有一个导航条目自定义控件,它有两个字符串属性script_expand和script_collapse。

<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"> 
<xp:panel
    id="outerpanel"
    styleClass="NavLeftRow"
    style="#{compositeData.node.styleShowOnFirstLoad}">
    <xp:panel
        id="innerpanel">
        <xp:this.styleClass><![CDATA[#{compositeData.node.inBreadCrumbPath ?  compositeData.panelStyleWhenActive : compositeData.panelStyleWhenInactive}]]></xp:this.styleClass>
        <xp:image
            id="imgCollapsed"
            url="/xpSectionCollapsed_oneUI.gif">
            <xp:this.style><![CDATA[#{compositeData.node.styleHideIfInBreadCrumb}]]></xp:this.style>
            <xp:this.rendered><![CDATA[#{compositeData.node.hasChildren}]]></xp:this.rendered>
            <xp:eventHandler
                event="onclick"
                submit="false">
                <xp:this.script><![CDATA[#{javascript:compositeData.script_expand}]]></xp:this.script>
            </xp:eventHandler>
        </xp:image>         
    </xp:panel>
</xp:panel>

脚本函数从外部调用;我正在通过手动操作来缓解计算相关ID的问题。

<xp:repeat
        id="repeatfourthlevelnodes"
        rows="200"
        var="fourthlevelnode"
        value="#{thirdlevelnode.children}">
    <xc:ccPanelNavigation
            node="#{fourthlevelnode}">
        <xc:this.script_expand>
            <![CDATA[expand("#{id:repeatfifthlevelnodes}");]]>
        </xc:this.script_expand>
    </xc:ccPanelNavigation>
</xp:repeat>

不像我希望的那么优雅,但比无法解释的代码好很多。

这是斯文的回答Pass javascript code to Custom Control这真的有帮助,所以这真的应该归他所有!