0

コンポーネント内にファセットがあり、その中にコンポーネントを動的に追加します

    UIComponent c = new UICustomComponent();
    c.setId("someIdGeneratedDynamically");
    facet.getChildren().add(c);

しかし、ポストバックで、このリストを繰り返し処理すると、コンポーネントは存在するが、それらの ID は以前に指定したものとは異なることに気付きました。(より具体的には、これらの ID は「j_id9、j_id10」などの形式です)

StateManagementStrategyImpl のコードを少しデバッグしたところ、ビューの保存中に意図的にコンポーネント ID を保存していないことがわかりました。

私の質問は、JSF がコンポーネント ID を保存しないのはなぜですか?

4

1 に答える 1

1

最後に述べた質問に答えるには、RestoreView フェーズで、JSF は要求されたビューをテンプレート ファイルから再構築します。テンプレートが変更されない限り、コンポーネントは常に同じ ID を受け取ると想定されています。状態は、clientIds をキーとして使用して保存されます。プログラムで clientId を変更した場合、状態を適切に復元することは不可能です。再作成されたコンポーネントは元の ID を持ち、その状態は別の (変更された) ID で保存されます。そのため、clientId を「保存」しません。これは、一定のままであることが期待され、再作成されたコンポーネントを前のリクエストの状態と一致させることができるものです。

この動作は、テンプレートから作成されたコンポーネントにのみ適用されると思います。JSF には、プログラムで追加されたコンポーネントを処理するための専用のメカニズムがあり、このメカニズムが clientIds を期待どおりに処理することを期待しています。

于 2012-02-28T13:36:49.840 に答える