Использование повторителя для отображения значений поля с несколькими значениями

Я настроил повторитель и читаю значение из многозначного поля, используя 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

Возможно, вы можете упростить свой код, назвав его, используя только «данные строки» в качестве значения для вашего текстового элемента. Затем вам следует только изменить источник повтора на

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, он возвращает только его имя в виде строки, которая повторяется один раз. Используйте это значениеBinding:

value="#{myDataSource.MyMultiValueFld}"

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

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

Тогда вы сможете использовать ответ Криса Тухейса:

<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
Я рад, что у вас это работает, НО это решение слишком сложное, и его НЕ следует рассматривать как передовую практику всем, кто читает этот ответ. Ответы Тухи и Буссе - лучший способ сделать это, и они должны были сработать для вас. С уважением, у вас, вероятно, была ошибка где-то, когда вы сказали, что тестировали, и это вернуло myArray. - person David Leedy; 11.08.2014
comment
Я согласен с @DavidLeedy: код слишком сложен, много SSJS, где вы можете иметь только два простых EL: #{myDataSource.myMultivalueFld} и #{rowdata}... - person Frantisek Kossuth; 12.08.2014

Вы можете обрезать этот код дальше. Если все, что вам нужно, это значения, вам не нужна индексная переменная и вам не нужно ссылаться на повтор как на XspDataIterator. Просто используйте данные строки в качестве переменной.

<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