1

レンダリングされた属性からメソッドを呼び出していますが、メソッドがRENDER_RESPONSEフェーズで複数回トリガーされていることに気付きました。

また、メソッドが他のフェーズ(APPLY_REQUEST_VALUES、PROCESS_VALIDATIONSなど)でも何度もトリガーされていることにも気づきました。

これらの呼び出しの背後にある理由が伝えられた関連クエリ(レンダリングされた属性によってゲッターが何度も呼び出されるのはなぜですか? )を見ました。

メソッドが1回だけ呼び出されるように、これを制御できる方法はありますか。

私の使用法

<rich:panelMenuItem label="Menu1" actionListener="#{testMenuMB.panelMenuClickedAjax}" rendered="#{testMenuMB.checkForRendering('RoleA,RoleB')}"></rich:panelMenuItem>

public boolean checkForRendering(String rolesString){
System.out.println("Roles-->"+rolesString+FacesContext.getCurrentInstance().getCurrentPhaseId());
        boolean authorized = false;
        String [] rolesArray = rolesString.split(",");
        for (String string : rolesArray) {
            if(string!=null && accesibleRolesMap.containsKey(string)){
                authorized = true;
                break;
            }
        }
        return authorized;
    }
4

1 に答える 1

1

メソッドが呼び出される回数、そのフレームワークのライフサイクルを制御することはできません。ブール値を設定する適切な場所を見つける必要があります。たとえば、コマンドクリックアクションメソッドで、このブール値をレンダリングメソッドで使用して、ロジックがアクションメソッドで1回実行され、ブール値のみが返されるようにします。

もう1つは、レンダリング応答の現在のライフサイクルフェーズをプローブすることで、if条件でロジックを保護できることです。

 if(FacesContext.getCurrentInstance().getRenderResponse()){
    //logic
 }

しかし、私は最初のオプションを好みます。

于 2013-02-26T10:45:19.680 に答える