Използване на повторител за показване на стойности на полето с множество стойности

Настроих повторител и чета стойността от полето с множество стойности, използвайки 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>

person L.Pursell    schedule 11.08.2014    source източник


Отговори (6)


rowdata не е препратка към стойността на myArray като цяло, а повторения запис в myArray. С други думи... вече имате това, от което се нуждаете.

<xp:label value="#{rowdata}" />
person Chris Toohey    schedule 11.08.2014
comment
Опитах, че това, което се намира в етикета на повторителя, е myArray, а не това, което всъщност е в масива. Така че, ако моят масив съдържа 3 стойности Name1, Name2, Name3 всичко, което виждам, е MyArray, а не списъкът с имена. - person L.Pursell; 11.08.2014

Може би можете да опростите кода си, като наименувате, като използвате само "rowdata" като стойност за вашия текстов елемент. След това трябва само да промените източника на повторение на

myDataSource.getItemValue("myValueFld")

тъй като това винаги връща масив от данни. Просто зависи от типа данни, които този елемент съхранява, така че може да се наложи да преобразувате в текстовия контрол.

person Oliver Busse    schedule 11.08.2014

Здравейте, кодът ви има друг проблем, нямате израз за връщане в този ред:

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

така че кодът не връща вашия myArray, а само връща името му като низ, който се повтаря веднъж. Използвайте това a valueBinding:

value="#{myDataSource.MyMultiValueFld}"

или добавете return:

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

Тогава трябва да можете да използвате Отговор на Chris Tooheys:

<xp:label value="#{rowdata}"/>
person Michael Saiz    schedule 12.08.2014

Използвайте свойството indexVar на контролата за повторение, за да настроите променлива, съдържаща индекса.

person Per Henrik Lausten    schedule 11.08.2014
comment
А, разбира се. Вие търсихте решение, а не наистина индекса. Съгласен съм с казаното от Крис Тухи в отговора му. - person Per Henrik Lausten; 11.08.2014

Схванах го. Последната част от кода е, че трябваше да създам indexVar="I" в моя таг repeat1, но след това също трябваше да променя етикета си на изчислено поле. Последната част от кода изглежда така:

<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. Благодаря

person L.Pursell    schedule 11.08.2014
comment
Радвам се, че това работи, НО това решение е прекалено сложно и НЕ трябва да се смята за най-добра практика от всеки, който чете този отговор. Отговорите на Toohey и Busse са по-добрият начин да се справите и трябваше да ви свършат добра работа. С уважение, вероятно сте имали грешка някъде, когато казахте, че сте тествали и той върна myArray. - person David Leedy; 11.08.2014
comment
Съгласен съм с @DavidLeedy: кодът е прекалено сложен, много SSJS, където можете да имате само два прости EL: #{myDataSource.myMultivalueFld} и #{rowdata}... - person Frantisek Kossuth; 12.08.2014

Можете да отрежете този код допълнително. Ако всичко, от което се нуждаете, са стойностите, нямате нужда от indexvar и не е необходимо да препращате към повторението като 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>

Each value in the multi-value field is a "row" as referenced by rowdata. Similarly, if the data source were a view, each row would reference a document object. Don't dispose of the framework available to you by accessing the repeat as a component from inside the component itself.

person David Navarre    schedule 12.08.2014