2012-03-24 149 views
0

我试图让h:inputText在单击h:commandButton时用不同的开关切换出来。为此,我试图将f:ajax命令与h:commandButton绑定在一起,让侦听器在bean上设置一个值(决定要显示哪一个值),然后重新渲染该区域。JSF f:ajax监听器没有调用

我已经尝试在h:commandButton上的f:ajax,actionListener上使用监听器,在f:ajax上执行h:commandButton上的操作。没有工作。我试图调用的主题完全没有被调用 - 没有println(请看后面的内容)。

panelGroup正在重新呈现,这就是为什么我需要onevent属性,重新附加一些基于标题的JavaScript提示文本(我有一个涉及此问题的早期问题)。

的方法,我试图调用:

public void morePressed(AjaxBehaviorEvent e) { 
    easySearch = !easySearch; 
    System.out.println("Made it!"); 
} 

不工作的JSF段(注意最后H:的commandButton正试图重新呈现panelGroup中):

<h:form> 
    <h:panelGroup id="switchSearchTexts"> 
     <h:inputText accesskey="s" alt="Search" id="searchBoxPeople" title="Search Plebeians" valueChangeListener="#{peopleBean.simplePersonQuery}" size="25" rendered="#{peopleBean.easySearch}"> 
      <f:ajax render="peopleDataTable" event="keyup" /> 
     </h:inputText> 

     <h:inputText accesskey="s" alt="Search First Name" id="searchBoxFN" title="Search First Name" size="25" rendered="#{!peopleBean.easySearch}"> 
      <f:ajax render="peopleDataTable" event="keyup" /> 
     </h:inputText> 
    </h:panelGroup> 

    <div id="expandBox"> 
     <h:inputText id="searchBoxLN" alt="Search Last Name" styleClass="hideToggle" title="Search Last Name" size="25" /> 
     <h:inputText id="searchBoxAddress" alt="Search Address" styleClass="hideToggle" title="Search Address" size="25" /> 
    </div> 

    <h:commandButton type="button" styleClass="moreButtonAsText" id="moreButtonAsText" value="&#x25b8;More"> 
     <f:ajax listener="#{peopleBean.morePressed}" render="switchSearchTexts" event="click" onevent="callFunctionAjaxRequest" /> 
    </h:commandButton> 

这是我附加到pageload上更多按钮的JavaScript(jQuery)。我给它并不是因为我认为它可以帮助,但我不知道这能以任何方式阿贾克斯听众的干扰:

$(function() { 
    textboxHint(); 
    $('input[id$="moreButtonAsText"]').toggle(function(e) { 
     $(this).prop('value', '\u25c2Less'); 
     $(".hideToggle").show(300); 
    } 
    , function() { 
     $(this).prop('value', '\u25b8More'); 
     $(".hideToggle").hide(100); 
     $('input[id$="searchBoxAddress"]').prop('value', function() { 
      return $(this).prop('title'); 
     }); 
     $('input[id$="searchBoxAddress"]').blur(); 
    }); 
}); 

我不知道。正如我所说的,我已经在h:commandButton上尝试了actionListener,其中有各种各样的appraoches,以及ajax上侦听器的各种方法。任何人都可以明白为什么听者不工作?

更新:

我最终什么事做,有一个答案之前,正在将一切显示和隐藏基于JavaScript,带的东西,如果他们没有JavaScript的最初隐藏我需要隐藏,等

但是我现在需要其他地方的f:ajax。

解决方法是在h:commandButton上取出event =“click”。我仍然现在知道这是为什么导致它打破,但嘿,无论工程。

回答

2

你真的在你的js代码中有一个名为callFunctionAjaxRequest的函数吗?因为如果没有它可能会导致键无法工作(因为它被引用到一个不存在的功能),

看萤火虫对于可能出现的错误......

试试这个版本的您的命令按钮(事件=“点击”可以去除过多...和自我执行过)

<h:commandButton type="button" styleClass="moreButtonAsText" id="moreButtonAsText" value="More"> 
    <f:ajax listener="#{peopleBean.morePressed}" render="switchSearchTexts" /> 
</h:commandButton> 

另一件事,在上输入文本你的Ajax调用你有参考searchBoxPeople两次(而不是searchBoxFN在第二个f:a jax),修复它造成的,否则当与其工作时使用searchBoxFN它的f:ajax会尝试执行一个元素,它不会被渲染...(可能导致严重问题...)

p。prependId="false"在您的h:form将简化您在jQuery中的选择器...

+0

我确实有callFunctionAjaxRequest,以及固定的ajax调用(并删除所有执行,因为我不需要它们)。 但是......奇怪的是,将事件=“点击”出来导致它工作。我想知道为什么离开它不工作? – twmb 2012-03-24 19:48:54

+0

event =“click”是多余的,但不应该造成任何伤害...怪异的,你确定它没有引用错误的ID没有造成危害吗? – Daniel 2012-03-24 19:57:32

+0

我正是这样的: ' 使用println in morePressed;它从未印过。以'event ='点击''出来到达println。我附加了一个jQuery切换到JavaScript文件中的按钮,但我不认为这会覆盖行为,并导致点击不起泡或什么;我没有任何传播停止。 – twmb 2012-03-24 20:04:24

1

问题是托管bean需要使用正确的签名事件作为输入参数进行设置。通过大量测试,我试图用AjaxBehaviorEvent来使用同一个类。就像在前一个论坛中的例子一样。

当我声明一个ActionListener事件(符合按钮jsf动作)时,该bean被执行!

我有同样的问题,并遵循你的例子来帮助我。我简单地(20小时)通过在我的豆中包括以下内容来解决这个问题:

第一个现在被解雇了!

public void actionListener(ActionEvent actionEvent) { 
    // Add event code here... 
    System.out.println("Made it!"); 
} 

public void morePressed(AjaxBehaviorEvent e) { 

    System.out.println("Made it!"); 
} 
3

我有这样的问题。事实证明,某处的inputText有一个值=“#{something.something}”,其中属性不可设置。这个例外没有在任何地方报道。我必须在Exception和所有子类上放置一个断点才能找到它。