У меня есть простой лед: dataTable, который имеет 2 столбца, один столбец действия, другой строку, представляющую регулярное выражение. Столбец действий имеет в качестве заголовка действие добавления, а для каждой строки — действие удаления. Мне все равно, как это работает, пока это работает. Прямо сейчас я пытаюсь имитировать составной компонент editableTable icefaces, который требует, чтобы вы выбрали строку, в которой действия отображаются для этой строки, а затем, когда вы нажимаете действие, оно применяется к выбранной строке. Поэтому, пытаясь выполнить эту работу, я создал простую таблицу данных с помощью 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 );
}
}
Что я замечаю, когда я прохожу этот код, так это то, что геттер для selectedTagPositiveRegexes вызывается 3 раза при нажатии на действие удаления, за которым следует фактический метод удаления, за которым следует еще 1 вызов геттера, после чего браузер получает ответ. это делает то, что я хочу. Однако какое-то событие должно быть поставлено в очередь чем-то, потому что после возврата ответа геттер вызывается еще 3 раза, после чего элемент после того, как этот элемент был удален, заменяется элементом, который был удален. Я понятия не имею, что здесь происходит, и у меня должно быть серьезное непонимание того, как это используется, но я предполагал, что datatable, поддерживаемый списком элементов, должен получать свое содержимое из этого списка. Таким образом, если я добавлю или удалю в/из списка, таблица данных должна представлять новое состояние. Но я, кажется, ужасно ошибаюсь в этом предположении. Любое понимание того, как это на самом деле работает, будет высоко оценено.