0

私は次のものを持っていますp:tabView

<p:tabView id="tabView" dynamic="true" cache="false" activeIndex="#{navigationController.activeTabIndex}"
    onTabChange="tabChangeCommand([{name:'index', value:index}])">
    <p:tab title="#{adbBundle['nav.manageUser']}" id="manageUserTab">
        <h:panelGroup layout="block">
            <h:form id="manageUserListForm">
                <ui:include src="/WEB-INF/includes/userList.xhtml">
                    <ui:param name="showOnlyActiveUsers" value="#{true}" />
                </ui:include>
            </h:form>
        </h:panelGroup>
    </p:tab>
    <p:tab title="#{adbBundle['nav.manageRole']}" id="manageRoleTab">
        <h:panelGroup layout="block">
            <h:form id="manageRoleListForm">
                <ui:include src="/WEB-INF/includes/userList.xhtml">
                    <ui:param name="manageRole" value="manageRole" />
                    <ui:param name="showOnlyActiveUsers" value="#{false}" />
                </ui:include>
            </h:form>
        </h:panelGroup>
    </p:tab>
</p:tabView>

2 つのタブはどちらも同じインクルード、つまりuserList.xhtml. この中に、テスト目的での値を確認するためuserList.xhtmlに を配置しました。h:outputTextui:param showOnlyActiveUsers

<h:outputText id="showOnlyActiveUsers" value="#{showOnlyActiveUsers}" />

この値は、タブの変更時にh:outputTextからtrueに変更さfalseれ、その逆も同様です。

UserListControllerビュー スコープ内にあるマネージド Beanは、 のバックボーンですuserList.xhtml。これはビュー スコープ内にあるため、これら 2 つのタブすべてに対して 1 回インスタンス化されます。

PrimefacesUserDataModelを拡張するクラスがあります。LazyDataModelこのクラスのインスタンスは にありますUserListControllerUserDataModelのゲッターメソッドからのフィールドに値を設定しようとしていますh:inputHidden:

<h:inputHidden value="#{userListController.showActiveOnly}" />

userList.xhtml次のようになりUserListControllerます。

public String getShowActiveOnly() {
    ValueExpression expression = getFacesContext().getApplication().getExpressionFactory().createValueExpression(getFaceletContext(), "#{showOnlyActiveUsers}", Boolean.class);
    userDataModel.setShowOnlyActiveUsers(expression.getValue(getFaceletContext());
    return "";
}

しかし、によって生成される値expression.getValue(getFaceletContext()は常にfalseです。の値が からにh:outputText変わるのはなぜだろうと思っていましたが、 によって生成される値は常に?truefalseValueExpressionfalse

この問題を解決するにはどうすればよいですか。どんなポインタでも私にとって非常に役に立ちます。

編集

protected final FaceletContext getFaceletContext() {
    return (FaceletContext) getFacesContext().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
}

私が達成したいのはui:param、マネージド Bean に値を渡し、そこからデータ モデルに渡すことです。

編集

userList.xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" xmlns:pe="http://primefaces.org/ui/extensions">

    <h:form id="userListForm">
        <p:panel id="userListPanel" header="#{adbBundle['userList.panel.header']}" toggleable="true">
            <p:dataTable var="user" id="userTable" value="#{userListController.userDataModel}" lazy="true" paginator="true" rows="10"
                paginatorPosition="bottom"
                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="10,50,100" widgetVar="userDataTable" styleClass="userTable" selectionMode="single">

                <f:facet name="header">
                    <p:outputPanel>
                        <h:panelGroup layout="block" id="resetFiter" styleClass="dataTableResetFilter">
                            <p:outputLabel value="#{adbBundle['filter.resetText']}" />
                            <p:spacer width="10" />
                            <p:commandButton icon="ui-icon-circle-close" actionListener="#{userListController.resetUserTable}"/>
                        </h:panelGroup>
                    </p:outputPanel>
                </f:facet>

                <p:column id="nameColumn" headerText="#{adbBundle['name']}" sortBy="#{user.fullName}" filterBy="#{user.fullName}" styleClass="name">
                    <h:outputText value="#{user.fullName}" />
                </p:column>

                <p:column id="statusColumn" headerText="#{adbBundle['status']}" sortBy="#{user.active}" styleClass="center status" filterBy="#{user.statusText}"
                    filterMatchMode="exact" filterOptions="#{userListController.statusOptions}">
                    <h:outputText value="#{user.statusText}" />
                </p:column>

                <p:column id="manageRoleColumn" headerText="#{adbBundle['role']}" sortBy="#{user.role}" styleClass="center manageRole" filterBy="#{user.role}"
                    filterOptions="#{userListController.roleOptions}" rendered="#{manageRole != null and manageRole != ''}">
                    <h:panelGroup layout="block">
                        <p:selectOneRadio id="roleRadio" value="#{user.role}" styleClass="roleRadio">
                            <f:selectItem itemValue="user" itemLabel="User" />
                            <f:selectItem itemValue="manager" itemLabel="Manager" />

                            <p:ajax listener="#{userListController.changeRole}" />
                            <f:attribute name="user" value="#{user}" />
                        </p:selectOneRadio>
                    </h:panelGroup>
                </p:column>
            </p:dataTable>
        </p:panel>

    </h:form>
</ui:composition>

私が望むのは、その現在の値を から取得し、ui:paramそれuserList.xhtmlを何らかのイベントによってマネージド Bean に渡し、それを に設定することdatamodelです。datamodelまた、ビュー スコープ内にあるため、マネージド Bean が作成されるときにインスタンス化されるのは 1 回だけであることも事実です。

4

1 に答える 1

2

このようなものを使用して、アクティブなユーザーを表示できます。

<h:form id="userListForm">
    <p:panel id="userListPanel" header="#{adbBundle['userList.panel.header']}" toggleable="true">
        <p:dataTable var="user" id="userTable" value="#{userListController.userDataModel}" lazy="true" paginator="true" rows="10"
            paginatorPosition="bottom"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="10,50,100" widgetVar="userDataTable" styleClass="userTable" selectionMode="single">

            <f:facet name="header">
                <p:outputPanel>
                    <h:panelGroup layout="block" id="resetFiter" styleClass="dataTableResetFilter">
                        <p:outputLabel value="#{adbBundle['filter.resetText']}" />
                        <p:spacer width="10" />
                        <p:commandButton icon="ui-icon-circle-close" actionListener="#{userListController.resetUserTable}"/>
                    </h:panelGroup>
                </p:outputPanel>
            </f:facet>
            <ui:fragment rendered="#{showOnlyActiveUsers and user.active}">
            <p:column id="nameColumn" headerText="#{adbBundle['name']}" sortBy="#{user.fullName}" filterBy="#{user.fullName}" styleClass="name">
                <h:outputText value="#{user.fullName}" />
            </p:column>

            <p:column id="statusColumn" headerText="#{adbBundle['status']}" sortBy="#{user.active}" styleClass="center status" filterBy="#{user.statusText}"
                filterMatchMode="exact" filterOptions="#{userListController.statusOptions}">
                <h:outputText value="#{user.statusText}" />
            </p:column>

            <p:column id="manageRoleColumn" headerText="#{adbBundle['role']}" sortBy="#{user.role}" styleClass="center manageRole" filterBy="#{user.role}"
                filterOptions="#{userListController.roleOptions}" rendered="#{manageRole != null and manageRole != ''}">
                <h:panelGroup layout="block">
                    <p:selectOneRadio id="roleRadio" value="#{user.role}" styleClass="roleRadio">
                        <f:selectItem itemValue="user" itemLabel="User" />
                        <f:selectItem itemValue="manager" itemLabel="Manager" />

                        <p:ajax listener="#{userListController.changeRole}" />
                        <f:attribute name="user" value="#{user}" />
                    </p:selectOneRadio>
                </h:panelGroup>
            </p:column>
             </ui:fragment>   
        </p:dataTable>
    </p:panel>

</h:form>

また、この形式でブール式を使用できます

<ui:param name="showOnlyActiveUsers" value="false" />

他の解決策は、ユーザーのリストを ui インクルードに渡すことです。「userListController.userList」と「userListController.activeUserList」の 2 つのメソッドを保持し、これを ui:param として usersList.xhtml に渡します。

于 2013-03-02T17:18:47.563 に答える