<h:form ...
<p:dataTable value="#{myBean.list}" var="data" ...
<p:column ...
<h:commandButton action="#{controller.method(data.id)}" />
</p:column>
</p:dataTable>
</h:form>
@ApplicationScoped
public class Controller {
public String method(final Long dataId) {
/* Do business */
return URL_WITH_REDIRECT;
}
}
(使用here所述的@ViewScoped
CDI注释
@ApplicationScoped
public class Producer {
@Named @ViewScoped @Producer
public MyBean getMyBean() {
final MyBean bean = new MyBean();
bean.list = new ArrayList<Data>(); // where Data has a Long id field
/* Do business and populate list */
return bean;
}
}
GET
页面
POST
已编辑到服务器@ViewScoped
个bean controller.method
调用data.id
并访问 1.1 String
GET
下一页...... 简而言之:点击后,将id复制到数据表外部,然后触发点击提交按钮。
在表格栏中h:commandButton
添加了:
onclick="$('input[id*=selectedDataId]').val('#{data.id}'); $('button[id*=callMethod]').trigger('click');"
在桌子外面:
<h:inputHidden id="{selectedDataId}"binding="#{selectedDataId}"/>
<p:commandButton type="submit"
id="callMethod"
label="Hidden button"
action="#{controller.method(selectedDataId.value)}"/>
最后它起作用了,但我无法弄清楚是什么原因导致了第一个&amp;重新初始化视图范围bean的基本方法。查看堆栈跟踪(见下文),似乎正在重建行。
是否有人有解释,并且可能需要注意以解决此问题?
其中:getPipelinecheckSearchResults
是检索支持表的列表的调用,这会导致生成器被调用
我已经阅读了以下文章/ SO问题,而没有更好地理解为什么上述(第一)解决方案的工作原理。
ViewScoped bean is recreated everytime I click on commandButton in my dataTable
Why does @PostConstruct callback fire every time even though bean is @ViewScoped? JSF
How can I pass selected row to commandLink inside dataTable?
http://balusc.blogspot.de/2010/06/benefits-and-pitfalls-of-viewscoped.html
答案 0 :(得分:1)
我找到了jsf / primefaces / ee-api / glassfish等的一些来源来调试行为,所以这就是答案:
component
:controller.method
)
datatable
datatable
根据@ViewScoped
bean controller.method
调用@ViewScoped
所依赖的datatable
bean将被重新生成(当然还有所有依赖项)经过测试:在JSF的版本2.1.7
中。
查看2.1.19
的来源,我希望在那里有相同的行为。
对于那些在寂寞的夏夜大声喊叫的人:“为什么?”
POST
已添加到服务器APPLICATION_INVOCATION
rowEvent & clickEvent
UIViewRoot:794
javax.faces.UIData
org.primefaces.component.datatable.DataTable
支持p:datatable
的祖父母开始处理活动@ UIData.broadcast(FacesEvent)
broadcast
方法首先保存最后一个选定行的索引rowEvent
clickEvent
的案例中调度UIComponent
上的Button
{}}}
ActionListener.processAction(ActionEvent)
处理
controller.method
,返回重定向String
,事情开始走下坡路redirectString
由NavigationHandler
处理
ViewMap
从@ViewScoped
行删除所有179
个bean。如果我们考虑它是合乎逻辑的,因为我们正在走出去。UIData.broadcast
时
302
)4.3.1
@ViewScoped
bean重新生成的地方。结束
虽然我没有经过测试,但我希望同样的行为h:datatable
,p:accordionPanel
,p:carousel
,p:galleria
,p:dataGrid
等等。子类UIData
的子组件,但不提供redirect
- 知道broadcast
方法。
答案 1 :(得分:0)
除非我错误地理解这一点,否则你正在使用一个以某种方式限定在视图范围内的bean(Seam 3,CODI或你自己编写的自定义范围)。只要JSF生命周期在相同的视图上运行(这是一个正确的假设),你就没事了,但是当你更改视图id时你会得到视图范围bean的新实例,你会感到惊讶吗?视图范围的整个目的是在JSF中保持相同的视图状态,只要您告诉JSF转到不同的视图ID,它就会创建一个新的视图状态。听起来你真正想要的是谈话范围。