4

単純なリンクの「prettifier」など、何らかのアクション パラメータを使用する単純な複合コンポーネントを考えてみましょう。私はそれを「アジャクシファイ」したい。

   <composite:interface>
        <composite:attribute name="act" method-signature="java.lang.String action()"></composite:attribute>
        <composite:attribute name="text" required="true"></composite:attribute>
            <composite:clientBehavior  name="click" event="action"  targets="l"/>    </composite:interface>

   <composite:implementation>
        <h:commandLink id="l" act="#{cc.attrs.action}" immediate="true">            <b>#{cc.attrs.text}</b>         </h:commandLink>    </composite:implementation>

クライアントの動作を通じてイベントを公開します。私はこのように使用します:

<h:panelGroup layout="block" id="outside">

        #{mybean.otherdata} <br/>

                <mc:mylink text="Click click" action="#{mybean.click}" >
                    <f:ajax event="click" render="outside"/>"
                </mc:mylink><br/>

</h:panelGroup>

私が何をしたいのかがわかります。コンポジット定義の外で ajax レンダリングを実行したいのです。render を「outside」に設定するだけで恐ろしい<f:ajax> contains an unknown idエラーが発生します。

はい、コンテナに名前を付けることは知っています。また、先頭にコロンを付けて絶対パスを指定できることも知っていますが、それは非常に扱いにくいものです。さらにいくつかのレイヤーにまとめると (これが要点です)、これらの参照を手動で連鎖させる必要があります。

render="../outside"コンポーネントの親コンテナへの参照をスキップするような相対参照を行うことはできますか?

私は a4j で jsf 1 アプリを作成しましたが、このパターンはいたるところで使用されていました。

4

5 に答える 5

8

JSF 2.0では、 EL内の暗黙オブジェクトccとオブジェクトを使用できます。componentコンポーネントの完全なクライアントIDを取得するには、次のようにします。

#{component.clientId}

複合コンポーネントのクライアントIDを取得するには、次のようにします。

#{cc.clientId}

同様に、。を使用して親をフェッチすることもできます#{cc.parent}。この場合、これはおそらくあなたが望むものです。もう少し長い答えについては、JSF2.0を使用したネーミングコンテナ内のコンポーネントclientIdの完全なプレフィックスを取得するを参照してください。

于 2010-08-18T08:57:56.990 に答える
1

いくつかいじくり回した後、ここに1つの解決策があります:

イベントにリスナーを配置します。

<f:ajax event="click" listener="#{mycomp.listen}" render="#{mycomp.getParId('outside')}"/>"

実装:

public void listen(AjaxBehaviorEvent event) {
    String clid=event.getComponent().getClientId();

    StringTokenizer st=new StringTokenizer(clid,":");

    StringBuilder sb=new StringBuilder(":");
    for (int x=1;x<st.countTokens();x++)
    {
        sb.append(st.nextToken()).append(":");
    }

    parId=sb.toString();
}

public String getParId(String suff) {
    //must precheck as id is prevalidated for existence. if not set yet set to form
    if (parId==null)
    {
        return "@form";
    }
    return parId+suff;
}

それでも、なぜあなたはこれをしなければならないのですか?

于 2010-06-22T00:56:49.643 に答える
1

render="@all"またはrender="@form"を使用して、すべてをレンダリングすることも、全体をレンダリングすることもできます。

または、更新したいものの絶対 ID をパラメーターとしてコンポーネントに渡すこともできます。これにより、ページの大部分を不必要に再レンダリングすることなく、柔軟性が維持されます。

于 2010-06-21T21:53:59.373 に答える
1

テンプレートで暗黙的な「コンポーネント」マッピングを使用する、満足できるさらに優れたソリューションを見つけました。../ファイルシステム表記を使用して、複合コンポーネントからの基本的な相対マッピングを許可します。より多くを処理するように拡張できますが、必要なのはそれだけです。パラメータの実行にも機能します。

それを理解してくれてありがとう!繰り返しますが、私は何か誤解していますか?私はこれを理解する必要はありません。

使用法:

<mc:mylink text="Click me" action="#{blah.myaction}" render="../../pg" />

実装:

<composite:implementation>

    <h:commandLink id="l" action="#{cc.attrs.action}" immediate="true">
        <f:ajax render="#{pathProcessor.pathProcess(3, cc.attrs.render, component.clientId)}" />
                     #{simon.rand} . <b>#{cc.attrs.text}</b>
    </h:commandLink>

.....

パスプロセッサ メソッド:

public static String pathProcess(int currentNesting, String path, String clid) {

    //System.out.println("clientid is "+clid);
    //System.out.println("path is "+path);
    //System.out.println("nesting is "+currentNesting);

    String backTok="../";
    String sepchar=":";

    StringBuilder src=new StringBuilder(path);
    int backs=0;
    int inc=backTok.length();

    while (src.indexOf(backTok,backs*inc)==backs*inc)
    {
        backs++;
    }

    //get rid of the source
    String suffix=src.substring(backs*inc);

    //add in internal nesting
    backs+=(currentNesting-4);

    StringTokenizer st=new StringTokenizer(clid,sepchar);

    StringBuilder sb=new StringBuilder(sepchar);
    for (int x=0;x<st.countTokens()-backs;x++)
    {
        sb.append(st.nextToken()).append(sepchar);
    }

    //backtracked path
    String p=sb.toString();

    //add suffix to the backtracked client path to get full absolute path
    String abs=p+suffix;

    return abs;
}

StringBuildererrrr -バックを数えるときに を使用した理由はわかりませんが、おわかりでしょう。それはそのようなものです。

于 2010-06-22T07:41:23.740 に答える