Xpages 使用中继器显示多值字段值

Xpages 使用中继器显示多值字段值,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我已经设置了一个中继器,正在使用GetItemValueArray从多值字段读取值。这将返回数组,如果使用列表框,它将显示。我想交叉引用一些其他数据,所以我需要使用一个中继器。但我不知道如何让中继器使用每行递增的索引。下面的代码“return rowdata[i]”无法识别i <xp:repeat id="repeat1" var="rowdata" rows="30"> <xp:this.value> <![CDATA[#{javascrip

我已经设置了一个中继器,正在使用GetItemValueArray从多值字段读取值。这将返回数组,如果使用列表框,它将显示。我想交叉引用一些其他数据,所以我需要使用一个中继器。但我不知道如何让中继器使用每行递增的索引。下面的代码“return rowdata[i]”无法识别i

<xp:repeat id="repeat1" var="rowdata" rows="30">
    <xp:this.value>
       <![CDATA[#{javascript:var myArray:Array = myDataSource.getItemValueArray("MyMultiValueFld")}]]>
    </xp:this.value>
    <xp:label id="lbl">
        <xp:this.value><![CDATA[#{javascript:return rowdata[i];}]]></xp:this.value>
    </xp:label>
</xp:repeat>


使用repeat控件的
indexVar
属性设置包含索引的var。

使用repeat控件的
indexVar
属性设置包含索引的var。

rowdata不是对myArray值的整体引用,而是myArray中的迭代项。换句话说。。。你已经有你需要的了

<xp:label value="#{rowdata}" />

rowdata不是对myArray值的整体引用,而是myArray中的迭代项。换句话说。。。你已经有你需要的了

<xp:label value="#{rowdata}" />

明白了。最后一段代码是,我确实必须在repeat1标记中创建一个indexVar=“I”,但随后我还必须将标签更改为计算字段。最后一段代码如下所示:

<xp:table>
    <xp:repeat id="repeat1" var="rowdata" rows="30" indexVar="i" first="0">
        <xp:this.value><![CDATA[#{javascript:myDataSource.getItemValueArray("myMultivalueFld");}]]>
        </xp:this.value>
        <xp:tr><xp:td>
            <xp:text escape="true" id="computedField1">
                <xp:this.value><![CDATA[#{javascript:var repeat1:com.ibm.xsp.component.xp.XspDataIterator = getComponent("repeat1");
                      repeat1.getValue()[i];}]]></xp:this.value>
            </xp:text>
        </xp:td>
       </xp:tr>
    </xp:repeat>
</xp:table>


如果没有indexVar上的花絮,我想我不可能得到它。谢谢,明白了。最后一段代码是,我确实必须在repeat1标记中创建一个indexVar=“I”,但随后我还必须将标签更改为计算字段。最后一段代码如下所示:

<xp:table>
    <xp:repeat id="repeat1" var="rowdata" rows="30" indexVar="i" first="0">
        <xp:this.value><![CDATA[#{javascript:myDataSource.getItemValueArray("myMultivalueFld");}]]>
        </xp:this.value>
        <xp:tr><xp:td>
            <xp:text escape="true" id="computedField1">
                <xp:this.value><![CDATA[#{javascript:var repeat1:com.ibm.xsp.component.xp.XspDataIterator = getComponent("repeat1");
                      repeat1.getValue()[i];}]]></xp:this.value>
            </xp:text>
        </xp:td>
       </xp:tr>
    </xp:repeat>
</xp:table>


如果没有indexVar上的花絮,我想我不可能得到它。谢谢

也许您可以通过使用“rowdata”作为文本项的值来命名来简化代码。然后只应将重复源更改为

myDataSource.getItemValue("myValueFld")

因为它总是返回一个数据数组。这取决于此项存储的数据类型,因此您可能必须在文本控件中进行转换。

也许您可以通过仅使用“rowdata”作为文本项的值来命名来简化代码。然后只应将重复源更改为

myDataSource.getItemValue("myValueFld")

因为它总是返回一个数据数组。这取决于此项存储的数据类型,因此您可能必须在文本控件中进行转换。

您好,您的代码还有另一个问题,这一行中没有任何返回语句:

<xp:this.value>
   <![CDATA[#{javascript:var myArray:Array = myDataSource.getItemValueArray("MyMultiValueFld")}]>
</xp:this.value>
或添加一个
返回

    <xp:this.value>
       <![CDATA[#{javascript:var myArray:Array = myDataSource.getItemValueArray("MyMultiValueFld");
 return myArray;}]>
    </xp:this.value>

然后你应该能够使用Chris Toohey的答案:

<xp:label value="#{rowdata}"/>

您好,您的代码有另一个问题,这一行中没有任何返回语句:

<xp:this.value>
   <![CDATA[#{javascript:var myArray:Array = myDataSource.getItemValueArray("MyMultiValueFld")}]>
</xp:this.value>
或添加一个
返回

    <xp:this.value>
       <![CDATA[#{javascript:var myArray:Array = myDataSource.getItemValueArray("MyMultiValueFld");
 return myArray;}]>
    </xp:this.value>

然后你应该能够使用Chris Toohey的答案:

<xp:label value="#{rowdata}"/>

您可以进一步修剪该代码。如果只需要这些值,则不需要indexvar,也不需要将repeat作为XspDataIterator引用。只需将rowdata用作变量

<xp:table>
<xp:repeat id="repeat1" var="rowdata" rows="30">
    <xp:this.value><![CDATA[#{javascript:myDataSource.getItemValueArray("myMultivalueFld");}]]>
    </xp:this.value>
    <xp:tr><xp:td>
        <xp:text escape="true" id="computedField1">
            <xp:this.value><![CDATA[#{javascript:rowdata;}]]></xp:this.value>
        </xp:text>
    </xp:td>
   </xp:tr>
</xp:repeat>


多值字段中的每个值都是rowdata引用的“行”。类似地,如果数据源是一个视图,则每一行将引用一个文档对象。不要通过从组件本身内部访问repeat作为组件来处理可用的框架。

您可以进一步修剪该代码。如果只需要这些值,则不需要indexvar,也不需要将repeat作为XspDataIterator引用。只需将rowdata用作变量

<xp:table>
<xp:repeat id="repeat1" var="rowdata" rows="30">
    <xp:this.value><![CDATA[#{javascript:myDataSource.getItemValueArray("myMultivalueFld");}]]>
    </xp:this.value>
    <xp:tr><xp:td>
        <xp:text escape="true" id="computedField1">
            <xp:this.value><![CDATA[#{javascript:rowdata;}]]></xp:this.value>
        </xp:text>
    </xp:td>
   </xp:tr>
</xp:repeat>


多值字段中的每个值都是rowdata引用的“行”。类似地,如果数据源是一个视图,则每一行将引用一个文档对象。不要通过从组件本身内部访问repeat作为组件来处理可用的框架。

Ah,当然。您正在寻找解决方案,而不是真正的索引。我同意克里斯·图希在回答中所说的。啊,当然。您正在寻找解决方案,而不是真正的索引。我同意Chris Toohey在他的回答中所说的,我试过中继器标签上的内容是“myArray”,而不是数组中的实际内容。因此,如果我的数组包含3个值“Name1”、“Name2”、“Name3”,那么我看到的是“MyArray”,而不是名称列表。我尝试过,中继器标签中显示的是“MyArray”,而不是数组中的实际值。因此,如果我的数组包含3个值“Name1”、“Name2”、“Name3”,那么我看到的只是“MyArray”,而不是名称列表。我很高兴你能做到这一点,但这个解决方案过于复杂,阅读此答案的人不应将其视为最佳实践。Toohey和Busse的答案是更好的方法,应该对你很有用。尊敬的是,当您说您进行了测试并带回了“myArray”时,您可能在某个地方遇到了一个bug。我同意@Davidledy的观点:代码过于复杂,很多SSJ只需要两个简单的EL:#{myDataSource.myMultivalueFld}和#{rowdata}…我很高兴您能做到这一点,但此解决方案过于复杂,阅读此答案的人不应将其视为最佳实践。Toohey和Busse的答案是更好的方法,应该对你很有用。尊敬的是,当您说您进行了测试并带回了“myArray”时,您可能在某个地方遇到了一个bug。我同意@Davidledy的观点:代码过于复杂,许多SSJ只需要两个简单的EL:#{myDataSource.myMultivalueFld}和#{rowdata}。。。