尝试动态绑定到折叠项扩展库控件中的 id



我正在使用 Xpages 扩展库附带的手风琴控件构建一个自定义控件。我正在尝试绑定到手风琴窗格 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>

任何帮助,不胜感激。

谢谢

以利亚·拉普森

几乎可以肯定的是 id 属性不能成为运行时绑定。这是因为服务器使用该 ID 在 XPage 上创建元素的映射。因此,它不能使用 # 动态计算。

除非 repeatContents 属性设置为 true,否则您将无法在重复中使用 $。$ 表示它将尝试在页面加载时计算 ID,但重复中的元素数尚未计算。它们将动态计算。因此,您需要在重复时重复内容="true",因此重复控件的内容是在页面加载时计算的。repeatControls 属性可能会对分页之类的事情产生连锁反应,但听起来这对您来说并不是一个问题。

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

最新更新