0

<h:selectBooleanCheckbox>DataTable のファセット ヘッダーでを使用しています。<h:column>そのDataTableのすべての行の内容は<h:selectBooleanCheckbox>. 行は、私が望んでいた方法で完全に選択されています。以下は私が使用したコードです:

<h:form>
<h:dataTable
    value="#{employeeService.employeeList }"
    var="empl"
    binding="#{employeeService.dataTablebinding }">
    ......
    ......
    ......
    <h:column>
            <f:facet name="header">             
                <h:selectBooleanCheckbox id="chkBoxAll" value="#{employeeService.checkedHdr }" valueChangeListener="#{employeeService.checkAll }" onclick="submit()"></h:selectBooleanCheckbox>
            </f:facet>
            <h:selectBooleanCheckbox id="tableChkBox" value="#{empl.checked }" valueChangeListener="#{employeeService.getCheckChanged }" onclick="submit()"></h:selectBooleanCheckbox>
        </h:column>
</h:dataTable>

これはのコードですValueChangeListener:

public void checkAll(ValueChangeEvent event){
    if(isInvokeApplicationPhase(event)){
        Iterator<Employee> empl = employeeList.iterator();
        while(empl.hasNext()){
            Employee emp = empl.next();             
            emp.setChecked(checkedHdr);
        }
    }
}

これは、isInvokeApplicationPhaseこのコードを機能させるために追加したユーティリティです (BalusCこのリンクで提案されている解決策を参照してください: JSF 1.2: valueChangeListener イベントが新しく選択された値を返さない):

public boolean isInvokeApplicationPhase(FacesEvent event){      
    if(event.getPhaseId() != PhaseId.INVOKE_APPLICATION){
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return false;
    }       
    return true;
}

今私の質問:

メソッドでのそのisInvokeApplicationPhaseチェックの使用は何ですか? ValueChangeListenerこのチェックをコメントアウトすると機能しません - なぜですか? 私は JSF のライフ サイクルを適切に理解していると思っていましたが、この動作は私が理解していないことを証明しています :(

JSFライフサイクルフェーズに基づく説明を教えてください。

4

1 に答える 1

5

値変更リスナーは、検証フェーズ中に実行され、値変更イベントにフックすることを目的としています。つまり、新しく送信された値は元のモデル値とは異なります。

検証フェーズは、モデル値の更新フェーズの前に実行されます。ここで、JSF は、送信され、変換され、検証されたすべての値をモデル (バッキング Bean のプロパティ) に設定します。そのため、値変更リスナーで別のフィールドのモデル値を変更しようとすると、モデル値の更新フェーズでオーバーライドされます。

この特定のトリックは、値の変更イベントを、モデル値の更新フェーズのに実行されるアプリケーションの呼び出しフェーズに再キューイングします。したがって、別のフィールドのモデル値を変更しようとしても、オーバーライドされません。

一言で言えば、検証フェーズはモデル値を手動で操作するのに適切なタイミングではなく、アプリケーションの起動フェーズはモデル値を手動で操作するのに適切なタイミングです。

実はここで値変更イベントが悪用されています。ここではむしろアクション イベントを使用する必要がありますが、これは JSF 1.x の入力では使用できませんでした。これは、フレーバーの JSF 2.x でのみ使用可能でした<f:ajax listener>

以下も参照してください。

于 2013-04-28T11:36:47.300 に答える