我正在使用 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') 匹配的类的元素的句柄