У меня есть простой лед: dataTable, который имеет 2 столбца, один столбец действия, другой строка, представляющая регулярное выражение.Столбец действия имеет в качестве заголовка действие добавления, а для каждой строки - действие удаления.Мне все равно, как это работает, пока это работает.Прямо сейчас я пытаюсь имитировать составной компонент icefaces editableTable, который требует, чтобы вы выбрали строку, и в этот момент действия отображаются для этой строки, а затем, когда вы щелкаете действие, оно применяется к выбранной строке.Поэтому, пытаясь сделать эту работу, я создал простой набор данных с rowSelector, который устанавливает мой item.selected для выбранной строки:
<ice:dataTable value="#{configuration.selectedTagPositiveRegexes}"
var="item">
<ice:column>
<ice:rowSelector value="#{item.selected}" />
<f:facet name="header">
<ice:commandLink styleClass="linkBlue"
action="#{configuration.tagRegexAdd}">
<ice:outputText value="Add" />
</ice:commandLink>
</f:facet>
<ice:commandLink styleClass="linkBlue"
action="#{configuration.tagRegexRemove}"
rendered="#{item.selected}">
<ice:outputText value="Remove" />
</ice:commandLink>
</ice:column>
<ice:column>
<f:facet name="header">
<ice:outputText value="Regular Expression" />
</f:facet>
<ice:inputText value="#{item.object}" size="100" />
</ice:column>
</ice:dataTable>
Затем в моем компоненте поддержки есть следующие 2 метода:
public void tagRegexAdd() {
log.debug( "add a new regex" );
for ( SelectableRow<String> row : selectedTagPositiveRegexes ) {
row.selected = false;
}
selectedTagPositiveRegexes.add( 0, new SelectableRow<String>( "", true ) );
}
public void tagRegexRemove() {
log.debug( "remove an existing regex" );
int i = 0;
int selectedIndex = -1;
for ( SelectableRow<String> row : selectedTagPositiveRegexes ) {
if ( row.selected ) {
selectedIndex = i;
row.selected = false;
}
i++;
}
if ( selectedIndex >= 0 ) {
selectedTagPositiveRegexes.remove( selectedIndex );
}
}
То, что я замечаю, когда я прохожу этот код, - это то, что метод get для selectedTagPositiveRegexes вызывается 3 раза при нажатии действия удаления, после чего следует фактический метод удаления, за которым следует еще один вызов метода получения вв этот момент браузер получает ответ, который делает то, что я хочу.Однако какое-то событие должно быть поставлено в очередь чем-то, потому что после возврата ответа получатель вызывается еще 3 раза, после чего элемент после того, как этот элемент был удален, заменяется элементом, который был удален.Я понятия не имею, что здесь происходит, и у меня должно быть серьезное недопонимание относительно того, как это используется, но я предположил, что объект данных, подкрепленный списком элементов, должен получать свое содержимое из этого списка.Таким образом, если я добавляю или удаляю из списка, таблица данных должна представлять новое состояние.Но я, кажется, совершенно неправ в этом предположении.Любое понимание того, как это работает на самом деле, будет высоко оценено.