我有一个网上商店申请。我想改进"从购物车中取出"特征。我不想问用户他是否想要"真的删除"从购物车的位置,而不是我想让他取消操作。
目前用户点击" 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
方法从未被调用过,只有当我尝试使用它时才会懒惰地构建它。
答案 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中删除,以便在下一个请求时它们将消失。 希望有所帮助