Как удалить строку из таблицы данных icefaces?

У меня есть простой лед: 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, поддерживаемый списком элементов, должен получать свое содержимое из этого списка. Таким образом, если я добавлю или удалю в/из списка, таблица данных должна представлять новое состояние. Но я, кажется, ужасно ошибаюсь в этом предположении. Любое понимание того, как это на самом деле работает, будет высоко оценено.


person Lucas    schedule 30.11.2010    source источник


Ответы (2)


Я не пробовал так, но это сработало для меня.

В управляемом компоненте создайте свойство типа HtmlDataTable, а затем используйте атрибут привязки ice:dataTable, чтобы указать на него. Теперь в обратном вызове сделайте следующее:

RowClass row=(RowClass)htmlTable.getRowData();
rowList.remove(row);

В некоторых случаях мне приходилось запускать это, чтобы оно обновлялось правильно. Я верю в это только тогда, когда у вас есть вложенные таблицы:

htmlTable.getChildren().clear();
person JOTN    schedule 30.11.2010
comment
Да, это то, что я делал в прошлом, но не понимал, зачем это нужно. Я пытаюсь сделать это сейчас, и если это сработает для этого случая, я отмечу это как решение, однако вопрос о том, что мой подход не работает, меня по-прежнему интересует. Если кто-нибудь может объяснить, что происходит, я был бы признателен. Спасибо ДЖОТН. - person Lucas; 30.11.2010
comment
Теперь, когда я смотрю на это поближе, кажется, что он ничего не делает по-другому... Вы все еще просто удаляете элемент из списка, который обернут ListDataModel, который используется самой DataTable. Я что-то упустил здесь? - person Lucas; 30.11.2010

Попробуйте добавить привязку к таблице данных, это может быть (org.icefaces.ace.component.datatable.DataTable) или (HtmlDatatable)

код будет

<ice:dataTable value="#{configuration.selectedTagPositiveRegexes}"
      var="item" binding="#{configuration.tabla}">

и фасоль:

private HtmlDatatable tabla;
public void tagRegexRemove() {
 objectClass   ob = (objectClass) this.tabla.getRowData();
 this.selectedTagPositiveRegexes.remove(ob);
}
person user2923486    schedule 11.02.2014