Использование @ManageProperty и datatable var "currentRow" - PullRequest
1 голос
/ 31 августа 2011

У меня есть bean-объект в области видимости ManageFoo.java:

@ManagedBean(name = "ManageFoo")
@ViewScoped
public class ManageFoo {

  @ManagedProperty(value = "#{currentRow}")
  private Foo currentRowBean;
  .
  .
  public void setCurrentRowBean(Foo foo) {...}
  public Foo getCureentRowBean() {...}

  public void edit(ActionEvent e) {
    getCurrentRowBean();
    .
    .
  }
}

У меня есть файл facelets ManageFoo.xhtml:

<h:dataTable value=#{ManageFoo.foos} var="currentRow">
  <h:column>
    <h:commandLink actionListener="#{ManageFoo.edit}"/>
.
.

Когда нажата команда 'linkLink',однако 'getCurrentRowBean' возвращает ноль.

У меня это работает нормально, используя FacesContext и вспомогательный метод getBean ("currentRow"), но я пытаюсь "JSF 2ify" моего веб-приложения, используя ManagedProperty, ManagedBean'sи т. д. Я просто не реализую это должным образом или пытаюсь использовать ManageProperty так, чтобы это не имело смысла?

После обратной связи от Balus его решение хорошо работает для моих методов действий, но я 'У меня возникли проблемы с его работой для методов, которые возвращают значения (например, логические).Следующий метод используется в связке «визуализированных» атрибутов для каждой строки.Например, если вы редактируете определенную строку, все другие кнопки редактирования в других строках исчезают, а кнопка редактирования для текущей строки заменяется кнопкой отмены редактирования и кнопкой сохранения.Итак, этот метод имеет разные возвращаемые результаты для каждой строки:

public boolean isCurrentRowEditing() {
    if(getCurrentRowDataBean().equals(getCurrentDataEditing())) {
        return true;
    } else {
        return false;
    }
}

Поскольку я пытаюсь исключить метод getCurrentRowDataBean () везде, мне нужен способ, чтобы это работало.

1 Ответ

1 голос
/ 31 августа 2011

@ManagedProperty устанавливается непосредственно после построения бина. В тот момент, когда компонент создан, JSF определенно не занят итерацией по данным. Кроме того, ваш компонент помещается в область видимости, поэтому он установлен, когда представление запрашивается впервые, а не когда вы отправляете форму в то же представление. #{currentRow} всегда будет null.

Есть несколько способов добиться этого. Если вы работаете с контейнером, поддерживающим EL 2.2, или используете JBoss EL, то вы можете просто передать его методу action (не listener!):

<h:commandLink action="#{manageFoo.edit(currentRow)}"/>

(обратите внимание, что я исправил имя вашего управляемого компонента, чтобы оно начиналось со строчной буквы, соответствуя правилам кодирования)

с

public void edit(Foo currentRow) {
    // ...
}

Если вы не работаете с контейнером, поддерживающим EL 2.2, и не можете использовать JBoss EL, тогда вам нужно привязать значение таблицы данных к DataModel и использовать DateModel#getRowData() внутри метода action (listener) для получения текущего строки.

Смотри также:


Обновление согласно вашему обновлению, просто сравните его в EL. Э.Г.

rendered="#{currentRow == manageFoo.currentRow}"

и

rendered="#{currentRow != manageFoo.currentRow}"

(обратите внимание, что это работает, только если equals() правильно реализован!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...