0

データテーブルでフィルタリングを使用しようとしています。テーブルが最初に読み込まれるときはいつでも、次のようになります。

ここに画像の説明を入力

ユーザー名のフィルターにテキストを入力すると、表は次のようになります。

ここに画像の説明を入力

mike.smith には「d」が含まれていないため、dangreen87 のみが表示されると予想されます。ただし、ユーザー名は表示されません。この動作が何であるかわかりませんか?

私は次のようなデータテーブルを持っています:

<h:body>
    <ui:composition>
        <h:panelGroup layout="block" styleClass="messagesPanel" rendered="#{socialAdvertiserManagedBean.displaySearch}" >
            <p:dataTable 
                resizableColumns="true"
                var="account" 
                value="#{searchManagedBean.accountsToDisplay}" 
                scrollable="true"
                paginator="true"
                rows="10"
                rowKey="#{account.id_value}"
                emptyMessage="No accounts found for the given criteria"
                widgetVar="searchTable"
                filteredValue="#{searchManagedBean.filteredAccounts}">
                <f:facet name="header">
                    #{searchManagedBean.isCompany ? 'Company' : 'Social Advertisers'}
                </f:facet>
                <p:column headerText="Image">
                    <p:graphicImage value="/dbimages/#{accountManagedBean.getImageId(account)}" width="25" height="25"/>
                </p:column>

                <c:if test="#{searchManagedBean.isCompany}" >
                    <p:column headerText="Company Name">
                        <h:outputLabel value="#{accountManagedBean.getCompany(account).name}" />
                    </p:column>
                </c:if>

                <c:if test="#{not searchManagedBean.isCompany}" >

                    <p:column id="userNameColumn" filterBy="#{account.userName}" filterMatchMode="contains">
                        <f:facet name="header">
                            <h:outputLabel value="User Name"/>
                        </f:facet>
                        <h:outputLabel value="#{account.userName}" />
                    </p:column>

                </c:if>

            </p:dataTable>

私のバッキング Bean は次のようになります。

@ManagedBean
@ViewScoped
public class SearchManagedBean implements Serializable
{

    private boolean isCompany;
    private Account selectedAccount;


    @EJB
    private AccountDao accountDao;

    @EJB
    private SocialAdvertiserDao socialAdvertiserDao;

    @EJB
    private CompanyDao companyDao;

    private List<Account> filteredAccounts;

    @PostConstruct
    public void init()
    {
        isCompany = true;
    }

    public List<Account> getAccountsToDisplay()
    {
        List temp;
        if(isCompany)
        {
            temp = companyDao.findAll();
        }
        else
        {
            temp = socialAdvertiserDao.findAll();
        }
        return temp;
    }

    public List<Account> getFilteredAccounts() {
        return filteredAccounts;
    }

    public void setFilteredAccounts(List<Account> filteredAccounts) {
        this.filteredAccounts = filteredAccounts;
    }


    public boolean getIsCompany() {
        return isCompany;
    }

    public void setIsCompany(boolean isCompany) {
        this.isCompany = isCompany;
    }

    ....
4

1 に答える 1

4

<c:if>ビュー スコープの Bean プロパティにバインドされたJSTLタグが原因です。

<c:if test="#{not searchManagedBean.isCompany}" >
    <p:column id="userNameColumn" filterBy="#{account.userName}" filterMatchMode="contains">
        ...
    </p:column>
</c:if>

@ViewScoped簡単に言えば、JSF2 FaceletsのタグハンドラーとJSTLで注意深く読んでください...理にかなっていますか? 簡単に言えば、ビュー スコープ Bean がすべての HTTP リクエストで再作成されるため、フィルタリングと並べ替えの ajax リクエスト全体で Bean の状態が完全にリセットされます。

この@ViewScoped+taghandler の問題は、Mojarra 2.1.18 以降で解決されています。基本的に、少なくとも Mojarra 2.1.18 にアップグレードする必要があります (現在は既に 2.1.25 です)。ただし、これは結局のところ標準的なアプローチではありません。renderedそのためには、の属性を使用する必要があります<p:column>

<p:column id="userNameColumn" filterBy="#{account.userName}" filterMatchMode="contains" rendered="#{not searchManagedBean.isCompany}">
    ...
</p:column>
于 2013-08-28T20:09:32.543 に答える