【问题标题】:JSF 2 - Dynamically added component's ids are not retained on postbackJSF 2 - 回发时不保留动态添加的组件 ID
【发布时间】:2012-03-17 22:19:26
【问题描述】:

我在组件中有一个方面,我在其中使用动态添加组件

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

但在回发时,当我遍历此列表时,我意识到组件存在,但它们的 id 与我之前指定的不同。 (更具体地说,这些 id 的形式为“j_id9、j_id10”等)

我在 StateManagementStrategyImpl 中调试了一些代码,并意识到它们在保存视图时故意不存储组件 ID。

我的问题是,为什么 JSF 不存储组件 id?

【问题讨论】:

    标签: jsf jsf-2 state-saving


    【解决方案1】:

    回答您最后提出的问题:在 RestoreView 阶段,JSF 从模板文件重建请求的视图。只要模板不改变,假定组件总是接收相同的 id。使用 clientIds 作为键保存状态。如果您以编程方式修改了 clientId,则无法正确恢复状态:重新创建的组件将具有原始 id,并且其状态将存储在另一个(修改后的)id 下。这就是它不“存储”clientId 的原因,它应该保持不变,并允许将重新创建的组件与其先前请求的状态相匹配。

    我相信这种行为仅适​​用于从模板创建的组件。 JSF 有一个专门的机制来处理以编程方式添加的组件,我希望这种机制能够按预期处理 clientId。

    【讨论】:

    • 嗯,不完全是。动态添加的组件确实保存了它们的客户端 ID。请参阅StateManagementStrategyImpl 中的ComponentStruct。我的问题是关于组件 ID 而不是客户端 ID。
    • 这正是我写的:动态添加的组件使用单独的状态管理机制,但我理解您的问题涉及一般机制。客户端 ID 是组件 ID 的派生词。
    • 无论组件 ID 或客户端 ID,它们都不会在组件实例的下一个请求中保留。客户端 ID 仅用于恢复状态(作为映射中的键),但这可能是它唯一的用途。
    • 客户端 ID 用于将发布的数据(由浏览器提交)与服务器端的组件进行匹配,正确恢复它们至关重要。不幸的是,我不知道为什么你的情况没有发生。
    • 真的。我的假设是 jsf 假设它会自动将组件 ID 分配给这些动态组件,而不是依赖用户在上面设置它们。我猜它适用于大多数人,因为最初,如果它已经分配了 id,那么在回发时,这些组件也将具有相同的 id,即 j_id1 等,因此解码会起作用。但不幸的是,当手动分配 id 时,情况就不同了。
    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2012-11-21
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多