f:viewParam在ajax调用后丢失。

问题描述 投票:0回答:1

我有这个f:viewParam来设置值,并在视图中的back bean中进行搜索。

<f:metadata>
<f:viewParam name="id"
    value="#{editorBean.id}"
    required="true" />
<f:event type="preRenderComponent"
    listener="#{editorBean.search}" />
...

Back bean:

private String id; // getters setters

public void search(ComponentSystemEvent event) {


    if (id != null) {
            //search data in DB to construct TreeNode finBy(id)...
...

在浏览器中,我无法展开树的第二层,因为在backing Bean中,id是空的。

enter image description here

Debug:

enter image description here

如何在所有调用中设置f:viewParam?

java jsf primefaces
1个回答
3
投票

这是因为 <h:form> 默认提交到一个没有查询字符串的URL。

要么把bean放在视图范围内。

@ManagedBean
@ViewScoped
public class EditorBean {

并在postback时跳过preerenderview。

public void search(ComponentSystemEvent event) {   
    if (FacesContext.getCurrentInstance().isPostback()) {
        return;
    }

    // ...
} 

只要你与同一个视图进行交互,一个视图作用域的Bean就会一直存在,因此属性不需要一次又一次地被初始化。

或者使用 全能型面孔 <o:form> 它提供了一个 includeViewParams 属性,以便在表单操作URL中包含视图参数。

<o:form includeViewParams="true">

另见。

© www.soinside.com 2019 - 2024. All rights reserved.