h:commandLink操作不会在要替换的同一片段中触发

时间:2011-07-08 03:03:16

标签: ajax jsf jsf-2

在问题commandButton/commandLink/ajax action/listener method not invoked or input value not updated中提到了7个问题。 现在,我遇到了同样的问题,但是我没有看到提到的哪个问题导致了我遇到的问题......我也没有在我读过的任何文章中找到解决方案。 我在一个片段中有一个h:commandLink,它位于:main:profileContentSnippet中,与项目有关:

              ...
             <h:commandLink action="#{usersController.prepareModel}" value="ViewDetails" immediate="true">
                  <f:param  name="pageViewId" value="EditDetails"/>
                  <f:ajax render=":main:profileContentSnippet"  />
              </h:commandLink> 
              ...

现在,它应该呈现:main:profileContentSnippet并修改它以呈现另一个片段(commandLink不是...的一部分)。它呈现EditProfilePersonalDetails,由参数发送。 commandLink操作不会触发。 现在,如果我从保存它的片段中删除它,它可以工作,但是h:commandLink仍然存在 - 我希望它消失,因为它所驻留的片段确实...我想知道为什么会这样?如果控件位于要使用AJAX的另一个片段替换的片段内,控件如何修改自己的外观?

提前致谢。

附加代码:

从上面单击h:commandLink后,snippetFileName应该更改(并且是)。 现在,包含h:commnandLink的文件将替换为:

           <h:panelGroup id="messagePanel" layout="block">
            <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
        </h:panelGroup>
</ui:composition>

注意:h:commnadLink也在ui:composition中。 应该触发的托管bean中的Action是:

@ManagedBean(name =“usersController”) @RequestScoped public class UsersController {        public String prepareConnected(){           //需要添加从会话中获取用户ID            System.out.println(“在prepareConnected中”);          current = ejbFacade.find((long)2);

        if (current == null){
            System.out.println("in prepareConnected is null");
        JsfUtil.addSuccessMessage("User Deleted in other request");
        return null;
    }
    return "viewPersonalDetails-snippet";
}

} ...

这个包含部分保存来自上面的commandLink:

<h:panelGroup id="profileContentSnippet" >
    <ui:include  src="#{snippetsProfileLinkerBean.snippetFileName}"/>
</h:panelGroup>

基本上,片段被修改,但当前变量保持为null,因为preapareConnected不会触发。如果我将其从代码段中移除到网站中不在其包含的部分中的其他部分。问题是我希望h:commandLink部分也会消失。

1 个答案:

答案 0 :(得分:0)

似乎应该为此工作做了一个web.xml定义:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

问题出在JSF 2流程中。第一次呈现页面时,JSF构建一个组件树,这意味着在创建组件树时,只有一个片段在该树中。因此,在(同一页面的)其他请求中,只有该组件可以注册一个动作和一个动作监听器。另一个组件没有,因为它不在从一开始构建的组件树中(尽管我可以在视图中看到它)。 现在,将javax.faces.PARTIAL_STATE_SAVING的定义修改为false,使JSF 2流在每个请求组件树上创建。它不是最好的解决方案,但我没有找到任何关于如何在构建树后动态地将组件插入到compont树的文档,而不是为每个请求再次构建它。