1

PrimeFaces2.2とJSF2.0.3を使用しています。

次のデータテーブルを含むxhtmlビューがあります。

<p:dataTable id="fooTable" 
    widgetVar="fooTable" 
    rowKey="#{foo.id}" 
    var="foo" 
    value="#{fooQueue.foos}"
    styleClass="table" 
    selection="#{fooQueue.selectedfoo}" 
    filteredValue="#{fooQueue.filteredfoos}"
    paginatorPosition="bottom" 
    paginatorAlwaysVisible="true" 
    selectionMode="single"
    rowEditListener="#{fooQueue.save}" 
    paginator="true" 
    rows="10" 
    rowIndexVar="#{foo.id}"
    emptyMessage="No foos found with given criteria" 
    rowStyleClass="#{foo.status == const.submitted ? 'gray' : null}"
    onRowSelectUpdate=":form:deleteValidation">

        <p:column id="mothersName" filterBy="#{foo.header1}"  filterMatchMode="contains">
            <f:facet name="header">
                <h:outputText value="Mother's Name" styleClass="tableHeader2" />
            </f:facet>

            <p:commandLink action="#{fooQueue.next(foo)}" 
                ajax="false" 
                disabled="#{foo.status == const.submitted || foo.id == 0}">
                <f:setPropertyActionListener value="#{foo}" target="#{fooQueue.selectedfoo}" />  
                <h:outputText value="#{foo.header1}" styleClass="tableData" />
            </p:commandLink>
        </p:column>

        <p:column sortBy="#{foo.header4}" >
            <f:facet name="header">
                <h:outputText value="DOB" styleClass="tableHeader2" style="width: 400px" />
            </f:facet>
            <h:outputText value="#{foo.header4}" styleClass="#{(foo.overSevenDays and foo.status != const.submitted and foo.id != 0)?'tableDataRed':'tableData'}" />
        </p:column></p:dataTable>

..次のバッキングBeanを使用:


@ViewScoped
@ManagedBean
public class FooQueue extends BaseViewBean { 

    private List foos;
    private Foo selectedFoo;
    private List filterdFoos;

    public FooQueue() {
        logger.debug("Creating new FooRegQueue");
        retrieveFooRecords();
    }

    private void retrieveFooRecords(){
        foos = new ArrayList();
        foos.addAll(fooService.getAllFoos());
    }

    public String next(Foo clickedFoo) {        
        System.out.println(clickedFoo.getId());     
        return "";
    }

    public Collection getFoos() {
        return foos;
    }

    public Foo getSelectedFoo() {
        return selectedFoo;
    }

    public void setSelectedFoo(Foo foo) {
        if (foo != null) {
            this.selectedFoo = foo;
        }
    }

    public void setFilterdFoos(List filterdFoos) {
        this.filterdFoos = filterdFoos;
    }

    public List getFilterdFoos() {
        return filterdFoos;
    }
}

母の名前列の「commandLink」とDOB列の「sortBy」に注意してください。

IEに限定されているように見える奇妙な問題が発生しました。データをDOBで並べ替えてから、最後のページに移動し、テーブルの最後のレコードのcommandLinkをクリックすると、2つのアクションイベントが発生します。最初のイベントは、ソートされたテーブルの最後のレコードをクリックしたことを正しく報告します。ただし、next()メソッドの2番目の呼び出しは、ソートされていないテーブルの最後のレコードに対するものです。

誰かが私のxhtmlまたはバッキングBeanの問題を特定できますか?これは既知のPrimeFacesの問題ですか?既知のIEの問題?

IE8でテストしています。

4

1 に答える 1

1

私はそれを解決しました。私は単にこれを変更する必要がありました:

<p:commandLink action="#{fooQueue.next(foo)}" 
  ajax="false" 
  disabled="#{foo.status == const.submitted || foo.id == 0}">
   <f:setPropertyActionListener value="#{foo}" target="#{fooQueue.selectedfoo}" />  
   <h:outputText value="#{foo.header1}" styleClass="tableData" />
</p:commandLink>

これに:

<p:commandLink action="#{fooQueue.next(foo)}" 
  ajax="true" 
  disabled="#{foo.status == const.submitted || foo.id == 0}">
   <f:setPropertyActionListener value="#{foo}" target="#{fooQueue.selectedfoo}" />  
   <h:outputText value="#{foo.header1}" styleClass="tableData" />
</p:commandLink>

ajax="true"に注意してください。以前はajax="false"に設定されていたため、バッキングBeanの新しいインスタンスがインスタンス化され、デフォルトのソート順で選択された行がロードされていました。これで、新しいインスタンスはインスタンス化されず、クリックした実際のレコードが読み込まれます。

于 2012-10-11T16:13:17.197 に答える