2017-08-03 81 views
0

我需要侦听器函数来检测用户何时清除inputText字段。当文本字段有一个新的字符串输入时,后台bean的值会立即更新,然后调用监听器函数,但是,通过调试,我注意到当一个字符串被清除时,后台bean变量没有被设置为null直到听众回来之后。由于我的侦听器函数依赖于(backingBeanvariable == null)测试,这导致了我的功能错误。有没有办法解决这个问题?JSF Ajax侦听器需要知道文本字段为空时

我的XHTML:

<p:column> 
    <p:inputText id="inputText" value="#{backingBean.variable}" 
     title="someTitle"> 
     <p:ajax resetValues="true" listener="#{backingBean.onChange()}" /> 
    </p:inputText> 
</p:column> 

辅助Bean监听功能:

public void onUiiTypeChange() 
{ 
    if (variable == null) 
    { 
     // some logic 
    } 
} 

编辑:当字段被清除的变量可能会设置为空字符串reather比空。无论哪种方式,直到侦听器函数返回后才会发生这种情况。即如果该字段在被清除之前包含“asdf”,那么当调用监听器函数时该变量仍将被设置为“asdf”。

+0

仅供参考,您的示例在我的设置中正常工作,我无法重现。似乎存在不一致性,正如您所说的通过调试所看到的那样,在侦听器被调用后该字段已更新为null,但是然后您正确地注意到该变量可能已设置为空字符串(即默认行为)。所以更彻底的调试可能会告诉你发生了什么。 – kingdc

+0

请按照http://www.stackoverflow.com/tags/jsf/info – Kukeltje

回答

0

为了实现您的p:ajax标记应该有一个事件,当用户与您的输入字段交互时侦听。这可以通过将p:ajax标记的event属性设置为侦听器值来完成。要知道event属性的这些可接受值,我会将您指向此answered question

你的小面:

<p:column> 
    <p:inputText id="inputText" value="#{backingBean.variable}" 
     title="someTitle"> 
     <!--added attribute event--> 
     <p:ajax resetValues="true" listener="#{backingBean.onChange()}" event="onblur"/> 
    </p:inputText> 
</p:column> 

现在,在你的bean方法,它接受一个AjaxBehaviorEvent作为参数,并返回void你把你的逻辑有: 如

public void onChange(AjaxBehaviorEvent event){ 

    //there are other ways to do this 
    String[] array = yourValue.split(" "); 
    //do something if array length satisfies your condition 
    //etc 
} 

最重要的是请注意,使用JSFEMPTY STRING不等于NULL STRING,这是作为默认设置。为了您需要的王牌断然表明,在您的web.xml文件,

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

进一步您的JSF和服务器版本起到了重要作用。 reference here

0

我不确定,但不是用户重置后的空字符串变量。这样你必须检查variable.equals("")

+0

中的要求将PF和JSF版本添加到该问题中您可能是正确的,它将被设置为空字符串而不是null,但无论如何,直到侦听器函数返回后才设置。 –