使用 @ManageProperty 和数据表变量"currentRow"



我有一个视图作用域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}"/>
.
.

当'commandLink'被点击时,'getCurrentRowBean'返回null。

我有这个工作良好使用FacesContext和getBean("currentRow")助手方法,但我试图"JSF 2ify"我的web应用程序通过使用ManagedProperty的,ManagedBean的,等。我只是没有正确地实现这一点,还是我试图使用ManageProperty的方式,没有意义?

经过Balus的反馈,他的解决方案对我的操作方法工作得很好,但我有麻烦让它对返回值(如布尔)的方法工作。下面的方法用于每行的一组"呈现"属性。例如,如果您正在编辑某一行,其他行上的所有其他编辑按钮都将消失,当前行的编辑按钮将被取消编辑按钮和保存按钮所取代。因此,该方法对每行有不同的返回结果:

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

由于我试图消除"getCurrentRowDataBean()"方法无处不在,我需要一种方法来工作

@ManagedProperty在bean构建后直接设置。在构建bean时,JSF肯定不会忙于遍历数据表。而且,您的bean被置于视图作用域中,因此它是在第一次请求视图时设置的,而不是在向同一视图提交表单时设置的。#{currentRow}总是为null

有几种方法可以实现这一点。如果您运行的是支持EL 2.2的容器,或者正在使用JBoss EL,那么您可以将它传递给操作(而不是侦听器!)方法:

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

(注意,我将您的托管bean名称以小写字母开头,以符合编码惯例)

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

如果您没有运行支持EL 2.2的容器,也不能使用JBoss EL,那么您需要将数据表的值绑定到DataModel,并在action(侦听器)方法中使用DateModel#getRowData()来获取当前行。

参见:

  • 我怎么能通过选定的行commandLink内dataTable?(显示所有可能的方式)
  • 推荐的JSF 2.0 CRUD框架(显示DataModel方式)
  • 从h:commandButton和JPA更新datatable中的backing bean(显示EL 2.2方式)

Update按你的更新,只比较它在EL。例如

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

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

(注意,这只有在equals()正确实现的情况下才有效!)

相关内容

  • 没有找到相关文章

最新更新