【问题标题】:How to get changed <p:calendar> value in backing component如何在支持组件中更改 <p:calendar> 值
【发布时间】:2013-03-13 17:15:50
【问题描述】:

我不确定如何正确地提出这个问题,但我会尝试这样: 问题是关于 Primefaces,复合 JSF2 日历。我想捕捉一个在日历更改后调用的事件(并捕捉它的新日期值)。

我的复合 xhtml:

    <composite:interface componentType="myComponent">            
        <composite:attribute name="value" required="true"/>            
    </composite:interface>

    <composite:implementation>
            <p:calendar 
                id="tempCalendar"
                pattern="dd.MM.yyyy" value="#{cc.attrs.value}" 
                valueChangeListener="#{cc.valueChanged}"                   
                validator="DateValidator" converter="MyDateConverter" showOn="button" showButtonPanel="true" navigator="true" >

                <p:ajax event="dateSelect"  update="@this" listener="#{cc.event1}"/>                   
            </p:calendar>
    </composite:implementation>

我的复合豆:

public void valueChanged(Object event) {

    log("valueChanged");
}

public void event1(AjaxBehaviorEvent ab) {
    log("Event1");
    if (ab != null && ab.getSource() != null && ab.getSource() instanceof Calendar) {
        //....
    }
}

我使用复合的页面:

<cc:inputdate value="#{mainBean.aDate}" />

在上面的代码中,我试图在 compotents bean 中捕获新值,但日志看起来像这样:

  1. valueChanged

  2. 事件1

  3. 设置日期

当我在 valueChangedListener 中时,我仍然有日历的旧值。最后设置新值。

所以,首先我想在我的复合 bean 中获得新的价值。但我的主要问题是:

如何在我的 mainBean 中实现一个事件,它会在更改时捕获该日历的新值?


编辑:我现在的合成:

<composite:interface componentType="myComponent">
    <composite:attribute name="value" required="true"/>
    <composite:attribute
            name="myListener"
            method-signature="void listener()" />

</composite:interface>

<composite:implementation>
    <h:panelGroup id="container">

        <p:calendar
            value="#{cc.attrs.value}"
            valueChangeListener="#{cc.valueChanged}"
            <p:ajax event="dateSelect"  update="@this,:buttonpanel" listener="#{cc.attrs.myListener}"/>
        </p:calendar>

    </h:panelGroup>
</composite:implementation>

这样我在我的主页中调用它(与 mainBean 连接):

<cc:inputdate 
    value="#{mainBean.item.myDate}" 
    myListener="#{mainBean.event1}"/>

我想在 mainBean.java 更改后赶上 evet...

【问题讨论】:

    标签: ajax jsf jsf-2 primefaces composite-component


    【解决方案1】:

    您已将其指定为组合的value 属性,因此它应该可以通过继承的UIComponent#getAttributes() 在任何支持组件的方法中使用,如下所示:

    Object value = getAttributes().get("value");
    

    【讨论】:

    • 谢谢,它有效,我在组件 backingbean 中有新的价值。但是在 mainBean (与调用我的组合的页面相关联)中触发该更改事件会非常有帮助。所以就我而言,不是在 myComponent.java 中,而是在 mainBean.java 中。在 .NET 中,我会声明事件“已更改”,定义就是这样。在 JSF2 中,我知道灵魂必须关闭...
    • 但是如何获得一个新值呢?事件发生时,模型仍未设置。所以我不能使用 mainBean.getSomething()..
    • 模型在&lt;p:ajax listener&gt; 被调用时肯定会更新。也许您将它与valueChangeListener 混淆了?另见stackoverflow.com/questions/11879138/…
    • 感谢 BalusC,这很难解释,但它可以满足我的工作需要。谢谢
    【解决方案2】:

    您可以从组件的本地值访问它。 即,

    我的测试 Facelet

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <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">
    <f:view>
        <h:head />
        <h:body>
            <h:form>
                <p:calendar pattern="dd.MM.yyyy">
                    <p:ajax event="dateSelect" process="@this"
                        listener="#{testBean.event1}" />
                </p:calendar>
            </h:form>
        </h:body>
    </f:view>
    </html>
    

    我的测试豆

    import org.primefaces.component.calendar.Calendar;
    
    @ManagedBean(name="testBean")
    @SessionScoped
    public class TestBackingBean 
    {
        public void event1(AjaxBehaviorEvent ab) 
        {
            if (ab != null) 
            {
                Calendar calendar =  (Calendar) ab.getSource();
    
                if(calendar != null)
                {
                    System.out.println(String.format("Newly selected value: %s", 
                            calendar.getLocalValue()));
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答,但...首先:1)我在代码中犯了一个错误,我粘贴了旧版本的 event1.. event1 方法不能将 AjaxBehaviorEvent 作为参数...应该看起来像没有参数的 event1()。 2)其次..也许还有其他事件然后dateSelect? dateSelect 在为其变量设置值之前。我需要一个像“dateWASChanged”这样的事件..
    • 在我粘贴的上述示例中,甚至在触发选择的 setter 方法之前,正在检索日历所选日期的新值(即本地值)。我认为这是您必须解决的需求。不是吗?
    • 好吧,我现在在 event1 事件中获得了新价值(有点不同,但仍然如此)。现在我想在我的 mainBean -bean 中触发这个事件,它与显示我的复合的 xhtml 连接。请看我的编辑..
    猜你喜欢
    • 2019-04-09
    • 2013-09-28
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2011-04-30
    相关资源
    最近更新 更多