Teamstudio Unplugged: добавление дополнительных строк таблицы без частичного обновления
Я использую Teamstudio Unplugged, чтобы попытаться расширить строку таблицы с привязкой inputTexts к документу.
Функция этой таблицы состоит в том, чтобы пользователь записал наблюдение и затем описание наблюдения.
После этого пользователь должен иметь возможность нажать кнопку и получить еще один ряд, чтобы он мог добавить еще одно наблюдение.
Я не могу частично обновить всю таблицу, потому что это приведет к тому, что inputTexts перезагрузит привязанное к ним значение.
Я не могу частично обновить новую строку и изменить ее класс стилей с помощью серверных сценариев, потому что идентификаторы не переносятся из конструктора. Это означает, что это в дизайнере:<xp:tr id="row1">
становится это в компьютерном симуляторе: <tr>
Поэтому я не могу решить эту проблему с помощью вычисленного стиля и частичного обновления. Так что теперь я создал кнопку, включенную ниже, но она только дважды работает. после этого строка onclick никогда не меняется.
<xp:button value="Flere observationer" id="button4" styleClass="button">
<xp:this.attrs>
<xp:attr name="onclick">
<xp:this.value><![CDATA[#{javascript:
return "$('.row"+sessionScope.rows+"').removeClass('hidden');"
}]]></xp:this.value>
</xp:attr>
</xp:this.attrs>
<xp:eventHandler event="onclick" submit="true" refreshMode="partial"
refreshId="button4">
<xp:this.action>
<xp:executeScript script="#{javascript:sessionScope.rows++;}">
</xp:executeScript>
</xp:this.action>
</xp:eventHandler>
</xp:button>
2 ответа
Это можно сделать в Unplugged с использованием стандартных (-ish) техник XPages, что может быть проще для тех, кто плохо разбирается в JQuery. Я бы никогда не рекомендовал использовать таблицу для разметки, используйте <div>
и или <ul/li>
теги и использовать CSS. Однако, чтобы ответить на этот конкретный вопрос, я использовал таблицу (забираясь с мыльницы)...
Поэтому я предполагаю, что данные в каждой строке находятся в одном документе. Если это так, и пользователь пишет по одному наблюдению за раз, почему бы не использовать полное обновление? Все делается на стороне клиента на Unplugged (даже серверные части - если это имеет смысл), поэтому это быстро. Этот метод показывает существующие наблюдения (если применимо) и позволяет пользователям вводить еще одну строку за раз:
Добавьте в форму скрытое поле - NoOfObservations - это может быть текстовое поле, которое будет использоваться в качестве индекса в XPage.
Добавьте свой источник данных на XPage в форму
Создайте событие beforePageLoad, чтобы установить индекс из существующего или нового документа:
<xp:this.beforePageLoad><![CDATA[#{javascript:
var ObservationCount = 0;
if(!document1.isNewNote()){
ObservationCount = document1.getItemValue("NoOfObservations")[0];
}
sessionScope.put("observations", ObservationCount);
}]]>
</xp:this.beforePageLoad>
Создайте свою таблицу с существующими строками - используя элемент управления xp:repeat с индексом в sessionScope для создания ваших строк - добавив 2 новые строки для новых записей:
<table>
<xp:repeat id="repeat1" rows="30" var="rowData"
indexVar="dataRows">
<xp:this.value><![CDATA[#{javascript:sessionScope.get("observations");}]]></xp:this.value>
<tr>
<td>
<xp:label value="Observation" id="label1"
style="color:rgb(255,255,255)">
</xp:label>
</td>
<td>
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:return document1.getItemValueString("ObservationTitle" + dataRows);}]]></xp:this.value>
</xp:text>
</td>
</tr>
<tr>
<td>
<xp:label value="Details" id="label2"
style="color:rgb(255,255,255)">
</xp:label>
</td>
<td>
<xp:text escape="true" id="computedField2">
<xp:this.value><![CDATA[#{javascript:return document1.getItemValueString("ObservationDesc" + dataRows);}]]></xp:this.value>
</xp:text>
</td>
</tr>
</xp:repeat>
<tr>
<td>
<xp:label value="New Observation"
id="newObservationTitle" style="color:rgb(255,255,255)">
</xp:label>
</td>
<td>
<xp:inputText id="inputText1"></xp:inputText>
</td>
</tr>
<tr>
<td>
<xp:label value="New Description"
id="newObservationDesc" style="color:rgb(255,255,255)">
</xp:label>
</td>
<td>
<xp:inputTextarea id="inputTextarea1"></xp:inputTextarea>
</td>
</tr>
</table>
Используйте кнопку xp: со следующим SSJS в событии onClick:
<xp:button value="Save" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action>
<xp:actionGroup>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:
var newObservation = parseInt(sessionScope.get("observations")) +1;
document1.replaceItemValue("ObservationTitle" + newObservation, getComponent("inputText1").getValue());
document1.replaceItemValue("ObservationDesc" + newObservation, getComponent("inputTextarea1").getValue());
document1.replaceItemValue("NoOfObservations", newObservation);
document1.save();}]]></xp:this.script>
</xp:executeScript>
<xp:openPage name="/UnpMain.xsp"></xp:openPage>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>
Как и в случае с другим вашим вопросом, я снова склоняюсь делать это на стороне клиента, а не пытаться делать частичные обновления. Просто добавьте строки в таблицу с помощью jQuery, а затем сохраните значения из каждой строки в скрытых полях списка при сохранении документа.
Кроме того, для идентификаторов, с которыми вы хотите работать, вместо того, чтобы полагаться на идентификаторы, генерируемые сервером, добавьте свои собственные атрибуты и выберите элементы, используя их вместо этого.