Как я могу удалить строку из данных Icefaces? - PullRequest
0 голосов
/ 30 ноября 2010

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2014

Попробуйте добавить привязку к таблице данных, это может быть (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);
}
0 голосов
/ 30 ноября 2010

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

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

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

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

htmlTable.getChildren().clear();
...