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 回答