1

我正在使用 Xpages 扩展库中包含的手风琴控件构建自定义控件。我正在尝试绑定到 AccordianPane id,但收到错误消息:

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

错误是指这行代码:

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

我看到保罗威瑟斯在这里发帖:

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>

任何帮助表示赞赏。

谢谢,

以利亚拉普森

4

1 回答 1

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') 匹配的类的元素的句柄

于 2012-06-15T17:03:03.757 回答