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