尝试动态绑定到accordion扩展库控件中的id

时间:2012-06-15 15:57:54

标签: xpages

我正在使用Xpages Extension Library附带的accordion控件构建自定义控件。我试图绑定到AccordianPane id并收到错误:

属性ID的值不能是运行时绑定

错误是指这行代码:

<xe:djAccordionPane
              title="#{javascript:sectiontitles.getColumnValue('Section')}" id="#{javascript:sectiontitles.getColumnValue('Section')}"
                parseOnLoad="false">

我看到Paul Withers在这里发帖:

http://www.intec.co.uk/combining-and-an-alternative-approach/ 这让我觉得这是可能的,我只是不在那里。我在哪里使用$代替#?

以下是我正在使用的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:this.data>
        <xp:dominoView var="view1" viewName="MenuLinks"></xp:dominoView>
        <xp:dominoView var="view2" viewName="MenuLinksSections"></xp:dominoView>
    </xp:this.data>

    <xp:panel
        style="float:left;padding-left:20.0px;padding-right:20.0px; padding-top:20.0px">



        <xe:djAccordionContainer id="djBorderContainer1"
            style="width:200px; height:540px" styleClass="soria">
            <xe:this.selectedTab><![CDATA[#{javascript:var selectedTab = context.getUrlParameter("tab");
if (selectedTab == "") {
""
} else {
selectedTab
}
}]]></xe:this.selectedTab>

            <xp:repeat id="repeat1" rows="30" var="sectiontitles"
                value="#{view2}" disableOutputTag="true">

                <xe:djAccordionPane
                    title="#{javascript:sectiontitles.getColumnValue('Section')}" **id="#{javascript:sectiontitles.getColumnValue('Section')}"**
                    parseOnLoad="false">


                    <xp:text escape="true" id="computedField1">
                        <xp:this.value><![CDATA[#{javascript:var id = "#{id:djAccordionPane}";
id}]]></xp:this.value>
                    </xp:text>
                    <xp:text escape="true" id="computedField2"></xp:text>
                    <xp:repeat id="repeat2" rows="30" var="menulinks"
                        disableTheme="true">
                        <xp:this.value><![CDATA[#{javascript:var tview = database.getView("MenuLinks");
var v = sectiontitles.getColumnValue("unid");
var vc:NotesViewEntryCollection = null;
if (v != null) {

    vc = tview.getAllEntriesByKey(v);
}
vc
}]]></xp:this.value>

                        <xp:text escape="false">
                            <xp:this.value><![CDATA[#{javascript:menulinks.getColumnValues()[3]}]]></xp:this.value>
                        </xp:text>

                    </xp:repeat>
                </xe:djAccordionPane>
            </xp:repeat>

        </xe:djAccordionContainer>
    </xp:panel>


</xp:view>

感谢任何帮助。

谢谢,

Elijah Lapson

1 个答案:

答案 0 :(得分:2)

几乎可以肯定,id属性不能成为运行时绑定。这是因为服务器使用ID来创建XPage上元素的映射。因此无法使用#。

动态计算

除非repeatContents属性设置为true,否则您将无法在重复中使用$。 $表示它将尝试计算页面加载时的ID,但重复中的元素数量尚未计算。它们将动态计算。因此,重复时需要repeatContents =“true”,因此在页面加载时计算重复控件的内容。 repeatControls属性可能会对分页等问题产生连锁影响,但听起来不会对你造成影响。

但是,为什么要尝试计算ID?是这样你可以在CSJS的某处使用ID来获取每个元素的句柄吗?如果是这样,另一种方法可能是在djAccordionPane中添加一个普通的HTML元素,如div,并计算其ID。您不会遇到运行时绑定问题。或者,计算styleClass属性。然后,您可以使用dojo.query根据类属性选择元素。您应该能够使用dojo.query(。#{javascript:sectiontitles.getColumnValue('Section')})来获取具有与sectiontitles.getColumnValue('Section')匹配的类的元素的句柄