用户退出特定页面时执行某些操作

时间:2016-01-23 20:22:36

标签: jsf jsf-2 cdi shopping-cart

我有一个网上商店申请。我想改进"从购物车中取出"特征。我不想问用户他是否想要"真的删除"从购物车的位置,而不是我想让他取消操作。

目前用户点击" 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。很清楚,但它是如何组成的。你能解释一下你的想法吗?我尝试了一些东西,但看起来它没有正常工作。例如,@PreDestroy bean的ViewScoped方法从未被调用过,只有当我尝试使用它时才会懒惰地构建它。

2 个答案:

答案 0 :(得分:2)

在会话的@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的javax.faces.bean.ViewScoped在手,然后应该注意到它的@PreDestroy在几种情况下被破坏了。然后,您最好在基于CDI的@PreDestroy bean中执行@SessionScoped。或者,您可以使用OmniFaces @ViewScoped以多种方式修复和改进@PreDestroy bean的@ViewScoped。甚至可以在窗口卸载时调用它。

答案 1 :(得分:-2)

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