0

简要用例描述:

用户到达页面:http://localhost:8080/.../show.xhtml?itemId=1。MyShowBean是一个 @RequestScoped JSF 托管 Bean,它通过获取 id<f:viewParam.../>并在数据库中查找项目:

<f:metadata>
    <f:viewParam name="itemId" value="#{showBean.itemId}">
        <f:convertNumber integerOnly="#{true}"/>
    </f:viewParam>
</f:metadata>
<f:event type="preRenderView" listener="#{showBean.init()}"/>

用户还可以编辑显示的项目。我想ItemEditBean按需构建@ViewScoped(通过单击“编辑”按钮)。为了实现这一点,我做了以下事情:

<p:commandButton value="Edit" oncomplete="editWidget.show()" update=":itemEditForm">
    <f:setPropertyActionListener target="#{itemEditBean.id}" value="#{showBean.itemId}"/>
</p:commandButton>

我的问题是:有没有更好的方法将 itemId 传递给 @ViewScoped bean?

编辑:

执行按钮itemEditBean.fetch(id)操作p:command不会在页面呈现时初始化 @ViewScoped bean。

<p:commandButton value="Edit" oncomplete="editWidget.show()" update=":itemEditForm" action="#{itemEditBean.fetchItem(showBean.itemId)}"/>.

使用上面的代码 itemEditBean 可以按需构建。

4

2 回答 2

0

我认为@ViewScoped 不是专业人士。尝试部分表单提交。比如像这样,

 <p:commandLink immediate="true" id="addAccessoriesLink" update=":accessoriesEntryForm">  
        <h:graphicImage url="/images/add.png" styleClass="action-img"/>
              <f:setPropertyActionListener value="# AccessoriesActionBean.newAccessories}" target="#{AccessoriesActionBean.newAccessories}" />
  </p:commandLink>
于 2012-09-06T08:35:12.800 回答
0

问题是在不保留参数的后续请求中showEditBean重新构建。INVOKE_APPLICATION

只需确保使用f:param.

<p:commandButton value="Edit" oncomplete="editWidget.show()" update=":itemEditForm">
    <f:param name="itemId" value="#{showBean.itemId}"/>
    <f:setPropertyActionListener target="#{itemEditBean.id}" value="#{showBean.itemId}"/>
</p:commandButton>

PS您对@ViewScopedbean生命周期的看法是正确的:如果仅出现在s中,则它不是在页面加载时构建action的!

于 2012-09-06T08:47:38.340 回答