0

当我打电话时,我不明白为什么在我的 PrimeFaces 视图中

<f:setPropertyActionListener value="#{item}" target="#{tagController.current}" />

它从不调用支持的 bean tagController.setCurrent 方法。

我有以下观点:

  <h:form id="tableForm" styleClass="form-horizontal">
    <h:panelGroup id="dataPanel">   
      <p:dataTable value="#{tagController.lazyModel}" 
                   lazy="true"
                   id="table"
                   var="item"
                   paginator="true"
                   rows="10"
                   paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                   rowsPerPageTemplate="10,20,50" >

        <p:column headerText="Name" sortBy="#{item.name}" filterBy="#{item.name}">
          <h:outputText value="#{item.name}"/>
        </p:column>

        <p:column>
          <p:commandLink id="testButton" update=":testForm:panel" process="@this">
            <h:outputText value="Test" />
            <f:setPropertyActionListener value="#{item}" target="#{tagController.current}" />
          </p:commandLink >
        </p:column>
      </p:dataTable>
    </h:panelGroup>
  </h:form>

  <br/>

  <h:form id="testForm" styleClass="form-horizontal">
    <p:panelGrid columns="4" id="panel" >
      <h:outputLabel value="Name: #{tagController.current.name}" /> 
    </p:panelGrid>
  </h:form>

和以下支持的bean:

@ViewScoped 
@Named
public class TagController implements Serializable {

  @Inject
  TagFacade tagFacade;

  protected LazyDataModel<Tag> lazyModel;
  protected ResourceBundle bundle = ResourceBundle.getBundle("resources/messages");

  @Getter
  protected Tag current = new Tag();

  public void setCurrent(Tag current) {
    System.out.println(">>>>>>>>>> THIS METHOD IS NEVER CALLED ? WHY ?");
    this.current = current;
  }

  public LazyDataModel<Tag> getLazyModel() {
  //... omitted for brevity
  }    
}

数据表运行良好,我看到数据、分页器、过滤器和排序运行良好,但是当我单击测试链接时没有任何反应(没有异常,没有 javascript 错误进入 html 页面,没有消息打印到标准输出......)。

我正在使用 Glassfish 3.1.2 / Mojarra 2.1.22 / PrimeFaces 3.5。

有人可以帮助我吗?

提前谢谢了...

4

4 回答 4

1

我注意到您将 CDI 与 JSF 注释混合在一起。CDI 没有视图范围的注释。您应该用 CDI 范围替换视图范围的注释或将 @named 注释更改为 @Managedbean

于 2013-06-08T14:32:42.017 回答
0

我有同样的问题,但有不同的解决方案。我有正确的注释等等,但是有一个对话框(我什至没有使用),其中包含以下代码

<h:inputText value="#{aSBean.newElement.vaSl}" validatorMessage="Nr bitte numerisch eingeben">  
            <f:validateDoubleRange minimum="1" maximum="999" />
</h:inputText>

不知何故(仍然不知道为什么)我的设置器无法使用对话框中的这段代码。只是添加这个以防其他人有这个问题,因为我花了几天时间才发现。

于 2014-01-29T15:13:06.370 回答
0

由于您使用的是 getter 注释,因此我怀疑默认情况下 setter 将直接通过您的变量传递。

你应该这样尝试

private Tag current = new Tag();

public void setCurrent(Tag current) {
    System.out.println(">>>>>>>>>> THIS METHOD IS NEVER CALLED ? WHY ?");
    this.current = current;
}

public Tag getCurrent() {
    return this.current;
}

更多信息 :

于 2013-06-07T21:45:17.130 回答
0
<p:column>  
    <p:commandButton id="bb" actionListener="#{yourmanagedbean.setmyvalue(item)}" 
        title="Test" update=":testForm:panel">
    </p:commandButton>  
</p:column>

在 backing bean 中看起来像这样

public void setCurrent(Tag current) throws Exception {
    try {
        this.current = current;
    } catch (Exception e) {
        // ...
    }
}

尝试在面板内制作 panelgrid 并更新它。

于 2013-06-07T21:22:39.300 回答