【问题标题】:PrimeFaces binding doesn't update form [duplicate]PrimeFaces 绑定不更新表单 [重复]
【发布时间】:2015-07-03 11:13:16
【问题描述】:

我正在处理 PrimeFaces 中的 JSF 绑定参数。

这是我的表格:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <h1 class="title ui-widget-header ui-corner-all">
        <p:spacer width="100" height="10" />
        PrimeFaces Test Binding
    </h1>
    <title><ui:insert name="title">PrimeFaces Test</ui:insert></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</h:head>
<h:body>
    <h:form id="form1"> 
        <h:panelGroup binding="#{bindingTestClass.panelGroup}" />
    </h:form>
</h:body>
</html>

这就是身体:

@ManagedBean(name="bindingTestClass")
@ViewScoped
public class BindingTestClass implements Serializable{

    transient HtmlOutputLabel testValue = null; 
    transient HtmlSelectOneMenu menu = null; 
    transient HtmlPanelGroup panelGroup = null; 

    @PostConstruct
    private void makeUp(){ 

        menu = new HtmlSelectOneMenu();
        panelGroup = new HtmlPanelGroup();
        testValue = new HtmlOutputLabel();

        panelGroup.setId("B");
        panelGroup.setLayout("block"); 
        panelGroup.setStyleClass("grid-form");

        //LINE 0
        testValue.setId("A");
        testValue.setValue("BasicLabel"); 
        panelGroup.getChildren().add(testValue);

        HtmlOutputText  linebreak = new HtmlOutputText();
        linebreak.setValue("<br/>");
        linebreak.setEscape(false);
        panelGroup.getChildren().add(linebreak); 

        menu.setId("F"); 

        // populate the drop down list 
        UISelectItems items = new UISelectItems(); 

        List comboList = new ArrayList(); 

        comboList.add(new SelectItem("---")); 
        for(int a = 0; a <10; a++){
            comboList.add(new SelectItem( a+1 + " test"));
        } 
        items.setId("ss");
        items.setValue(comboList); 
        menu.getChildren().add(items); 
        //Add list to combobox 
        /*this first attempt doesn't work either, only change backend values
        menu.addValueChangeListener(new ValueListenerTest()); 
        menu.setOnchange("submit()");
        */ 
        AjaxBehavior ajaxBehavior = (AjaxBehavior) FacesContext.getCurrentInstance().getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
        ajaxBehavior.addAjaxBehaviorListener(new CustomAjaxListener());
        //ajaxBehavior.setTransient(true);  
        ajaxBehavior.setUpdate("form1");  
        menu.addClientBehavior("change",ajaxBehavior); 
        panelGroup.getChildren().add(menu);

    }

    //Getters,Setters 
    public HtmlPanelGroup getPanelGroup() {
        return panelGroup;
    }

    public HtmlOutputLabel getTestValue() {
        return testValue;
    }

    public void setTestValue(HtmlOutputLabel testValue) {
        this.testValue = testValue;
    }

    public void setPanelGroup(HtmlPanelGroup panelGroup) {
        this.panelGroup = panelGroup;
    } 
    public HtmlSelectOneMenu getMenu() {
        return menu;
    } 
    public void setMenu(HtmlSelectOneMenu menu) {
        this.menu = menu;
    } 
}

事实是,当且仅当我以这种方式将单独的绑定代码放在我的视图中:

<h:outputLabel binding="#{bindingTestClass.testValue}" />

显然,从面板组中取出相应的子项,当我更改 selectOneMenu 值时,侦听器会更改支持 bean 中的值,然后它会更新确实更新“testValue”标签值的表单。

我尝试了不同的尝试,但仍然不明白为什么它不能以这种方式工作,将所有内容放在一个面板组中。

谁能指出我正确的方向?

提前非常感谢!

编辑:上面的代码适用于@RequestScoped 范围,并且显然将所有属性变量置于“私有”修饰符模式。但是@ViewScoped 没有机会?

【问题讨论】:

  • 我不经常看到人们以编程方式在 backing-bean 中构建 JSF 组件。我并不是说一定不能这样做,但是如果您以非常规的方式实施事情,您将获得更少的答案。查看您的代码,我无法立即在 Facelets 页面 (ref) 上看到任何无法更轻松实现的内容。
  • 我不明白,如果我用 facelet 标签包装它也不起作用,它也不会在主标题之后显示任何内容。我需要以这种方式实现,我得到动态组件列表,在页面加载之前可以决定屏幕上必须显示什么。谢谢 4 合作社。
  • 在 SO 中搜索绑定和视图范围。绑定应该使用 requestscoped beans
  • 是的,在 requestScoped 中,它可以工作。但是如果想要一个 ViewScoped 怎么办?是的,在发布这篇文章之前我已经搜索了很多,我在这里只是因为我不能独自前进。编辑了更新信息和试用版。感谢您的宝贵合作。
  • 奇怪的代码,我从来没有见过有人做这样的事情,你为什么要从 MB 构建你的 html 东西。您想从代码中获得什么作为输出,您的大部分代码都可以在 jsf/xhtml 页面上完成,并且只在 MB 处执行 getter/setter/logic/etc。坦率地说,您让事情变得更加复杂,JSF 旨在通过 primeface/omniface/etc 等插件让生活变得更加轻松。

标签: jsf jsf-2 primefaces binding


【解决方案1】:

JSF 中的绑定仅适用于请求范围 bean。

Look at this question

【讨论】:

  • 如果您发现了一个骗子,只需投票/标记关闭,而不是将其发布为仅链接的答案。
猜你喜欢
  • 2021-02-24
  • 2014-08-03
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2022-01-23
相关资源
最近更新 更多