【问题标题】:Doing something whenever user exits particular page每当用户退出特定页面时做某事
【发布时间】:2016-01-23 20:22:36
【问题描述】:

我有一个网上商店应用程序。我想改进“从购物车中删除”功能。我不想问用户是否想从购物车中“真正删除”该位置,而是我想允许他取消操作。

目前当用户点击购物车中产品的“X”按钮时,表格行变为“已移除,点击取消”。在后面有一个CartPosition 对象列表,每个对象都带有标志removed。删除的产品仍在列表中,但标志设置为 true。它使产品在列表中的适当位置仍然可见,但在视图方面我可以用另一种方式呈现它。当用户点击另一个“X”时,前一个会被预先从列表中删除,新的会被标记为removed

购物车的会话范围为CDI bean。这意味着,当我标记某个位置removed 并去其他地方,然后回到购物车时,我仍然会有一行标记为removed。我只是不想要这个。

我考虑将 bean 更改为 JSF 的,然后创建另一个视图范围,它可以保留标记为 removed 的记录并检查它是否为空,如果是,我可以从列表中删除它。我不知道它是否会起作用。我会尝试这种方法,但我宁愿让我的 bean 由CDI 管理。

有没有办法在不实现我上面的想法的情况下处理这个问题?

编辑: @BalusC,你的假设是错误的。您应该假设,我不完全知道如何混合 CDI 和 JSF。我实际上使用的是 JSF 2.2,这意味着我可以使用 javax.faces.view.ViewScoped 注释。无论如何,我仍然不明白这个想法。我明白,我必须依赖一些ViewScoped bean。很清楚,但它必须如何组合。你能解释一下你的想法吗?我尝试了几件事,但看起来它无法正常工作。例如,我的 ViewScoped bean 的 @PreDestroy 方法从未被调用过,只有在我尝试使用它时才会懒惰地构造它。

【问题讨论】:

    标签: jsf jsf-2 cdi shopping-cart


    【解决方案1】:

    在会话的 @PreDestroy 注释方法中执行实际删除工作或查看作用域 bean。

    @PreDestroy
    public void destroy() {
        // Do the actual remove job here.
    }
    

    鉴于您的问题暗示您没有可用的基于 CDI 的 javax.faces.view.ViewScoped,这是自 JSF 2.2 以来的新功能,这反过来表明您仍在使用 JSF 2.0/2.1,因此只有基于 JSF 的 @987654322 @ 在手上,那么应该注意它的@PreDestroy 在几种情况下被破坏了。然后,您最好在基于 CDI 的 @SessionScoped bean 中执行 @PreDestroy。或者,您可以使用OmniFaces @ViewScoped,它以多种方式修复和改进了@ViewScoped bean 的@PreDestroy。它甚至在窗口卸载时被调用。

    【讨论】:

    • 如果使用了<o:form>javax.faces.view.ViewScoped 是否在窗口卸载时被销毁(当使用触发 GET 请求的超链接导航页面时)? (我在某处读到,此类功能将在 OmniFaces 的某个未来版本中引入)。
    • @Tiny:不,OmniFaces 对javax.faces.view.ViewScoped 没有特殊考虑,这在技术上也不是微不足道的,因为这需要特定于impl 的hackery。 <o:form> 在设计阶段仅被认为是可能的触发器,可将主脚本自动包含在 head 中,但后来在主脚本尚未包含时被删除并替换为在主体末尾包含卸载侦听器脚本组件,可以在这里看到github.com/omnifaces/omnifaces/blob/2.2/src/main/java/org/…
    • JSF 实现本身应该足够聪明,可以像 WebSockets 那样自动完成,其端点在卸载时会自动销毁:)
    • @Tiny: @WebSocketScoped 或许是个不错的主意 :)
    • 嗯,只需将会话范围的数据保存在会话范围的 bean 中,并将视图范围的数据保存在视图范围的 bean 中。只需在您自己提出时创建另一个视图范围 bean。您可以简单地 @Inject 一个在另一个(这仅不适用于 JSF 2.0/2.1,因为没有可用的 CDI 视图范围,并且您不能 @Inject a JSF @ManagedBean CDI @Named bean 中的 bean )。我没有说将您当前的会话范围 bean 更改为视图范围的 bean。
    【解决方案2】:

    据我了解,您的问题是会话。解决问题的一种方法是在请求属性中设置已删除产品的列表并将其从会话 bean 中删除,以便在下一个请求时它们将消失。 希望有帮助

    【讨论】:

    • 如果相关页面包含 ajax 内容(因此至少需要一个视图范围的 bean,而不是请求范围的 bean),这将失败。 OP 已经通过自己提出了视图范围建议来考虑这一点。
    • BalusC 我不明白你对这个解释的想法。我没有意识到这是一个 jsf 问题(而且我对此没有太多经验),但无论如何我认为 ajax 的东西没有任何问题。您可以决定要重新加载页面的哪个部分。当他说“去别的地方,然后回到购物车”时,意味着对购物图表片段的新请求。我错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多