【问题标题】:Primefaces calendar not firing dateSelectPrimefaces 日历未触发 dateSelect
【发布时间】:2017-07-15 07:55:48
【问题描述】:

我正在尝试通过 ajax 从我的日历中获取一个值。

xhtml 部分:

<p:calendar
    id="newSimFrom"
    value="#{SimModel.from}" <!-- this works -->
    showOn="button"
    mask="true"
    pattern="dd.MM.yyyy"
>                       
    <p:ajax event="dateSelect" process="@this" update="newSimUnt" listener="#{SimController.simFromChanged()}" />
</p:calendar>

控制器:

public void simFromChanged(SelectEvent se) {
    log.info("called");
    log.info(""+se.getObject()); 
    //this is temporary till I can figure out what's even going on
}

但我什么也没得到,似乎没有任何事件被触发。 我也试过event="change" 以及event="select"process="@this"(后者由https://stackoverflow.com/a/42295586 建议)

另外,我尝试在有和没有括号的情况下设置监听器,似乎没有任何区别。

日历位于表单标签内。 (有点,如果&lt;div&gt; 上面有 2 层,有区别吗?)(https://stackoverflow.com/a/17213127/7591918

我应该去哪里调试正在发生的事情?作为一个整体,我对 Primefaces 和 JSF 比较陌生,我的 IDE 控制台和浏览器控制台没有给我任何错误。

谢谢!

【问题讨论】:

    标签: jsf primefaces jsf-2


    【解决方案1】:

    您的侦听器中的方法拼写不正确。你忘记了“新”。

    如果您想获取事件,请不要使用括号。

    你得到的事件是一个 DateSelectEvent,所以这应该可以工作:

    xhtml:

    <p:ajax event="dateSelect" process="@this" update="newSimUnt" listener="#{SimController.newSimFromChanged}" />
    

    控制器:

    public void newSimFromChanged(DateSelectEvent se) {
        log.info("called");
        log.info("" + se.getDate()); 
        //this is temporary till I can figure out what's even going on
    }
    

    如果这不起作用,则错误必须在其他地方。

    【讨论】:

    • 啊,不,让我来解决这个问题。它在我的实际代码中拼写正确,我将其删减以使其对 StackOverflow 更具可读性。编辑:通过减少它,我并不是说我省略了任何东西,我只是更改了函数名称。
    【解决方案2】:

    Wep0n,试试这些例子:

    <p:calendar id="newSimFrom" value="#{SimModel.from}"
                showOn="button" mask="true" pattern="dd.MM.yyyy">
    
                <p:ajax event="dateSelect" update="newSimUnt" 
                        listener="#{SimController.simFromSelected}" />
    
                <f:ajax event="change" execute="@this" render="newSimUnt" 
                        listener="#{SimController.simFromChanged}"/>
    </p:calendar>
    

    在你的 managedBean SimController 内部:

    public void simFromSelected(DateSelectEvent event) {
        System.out.println("DateSelectEvent " + event.getDate());
    }
    
    public void simFromChanged(AjaxBehaviorEvent event) throws MWSException {
        System.out.println("AjaxBehaviorEvent " + event.getDate());
    }
    

    【讨论】:

    • DateSelectEvent 已被弃用,不再被识别/包含在我正在使用的 Primefaces 版本中。除了我在自己的答案中所说的之外,我的代码大部分都是正确的。不过,谢谢,肯定也会研究 AjaxBehaviourEvent 以供将来参考。
    【解决方案3】:

    所以显然,我的问题在于 Spring 如何在内部寻址类,或者更确切地说是自动名称生成是如何工作的,因为我没有明确命名 bean。

    listener="#{SimController.newSimFromChanged}"
    

    改为

    listener="#{simController.newSimFromChanged}"
    

    (注意小写的s)

    现在它可以工作了。

    这很不直观(IMO),我不确定这是否普遍适用,但如果其他人遇到同样的问题,我将把它留在这里。请注意,如果您的课程以多个大写字母开头,这也不适用,如果我将课程命名为 SIMController,它将立即生效。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 1970-01-01
      • 2011-11-15
      • 2017-12-24
      • 1970-01-01
      • 2015-04-17
      • 2013-11-01
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多