当我点击一个h:commandButton时,我试图用一个不同的h:inputText切换出来。为此,我试图将f:ajax命令与h:commandButton绑定,监听器在bean上设置一个值(决定显示哪一个),然后重新渲染该区域。
我已尝试在f:ajax上使用侦听器,在h:commandButton上使用actionListener,在f:ajax上执行h:commandButton上的action。没有任何效果。我试图调用的方法根本没有被调用 - 没有println(见下文)。
正在重新渲染panelGroup,这就是为什么我需要一个基于标题重新附加一些JavaScript提示文本的onevent属性(我之前有一个涉及此问题的问题)。
我试图打电话的方法:
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="▸More">
<f:ajax listener="#{peopleBean.morePressed}" render="switchSearchTexts" event="click" onevent="callFunctionAjaxRequest" />
</h:commandButton>
这是我附加到pageload上的More按钮的JavaScript(jQuery)。我不赞成,因为我认为它可以提供帮助,但我不知道这是否会以任何方式干扰ajax监听器:
$(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。
解决方案是取出事件=&#34;点击&#34;在h:commandButton上。我仍然现在知道为什么这会导致它破裂,但是,嘿,无论有什么用。
答案 0 :(得分:3)
我有这样的问题。原来,某个地方的inputText有一个值=“#{something.something}”,其中属性不可设置。没有在任何地方报告例外情况。我不得不在Exception和所有子类上设置断点来查找它。
答案 1 :(得分:2)
你的js代码中真的有一个名为callFunctionAjaxRequest
的函数吗?因为如果不是它可能导致按钮不起作用(因为它被引用到一个不存在的函数),
查看萤火虫可能出现的错误......
试试这个版本的命令按钮(event =“click”也可以删除......也可以自行执行)
<h:commandButton type="button" styleClass="moreButtonAsText" id="moreButtonAsText" value="More">
<f:ajax listener="#{peopleBean.morePressed}" render="switchSearchTexts" />
</h:commandButton>
另一件事,在您输入上部文本的ajax调用中,您引用searchBoxPeople
两次(而不是第二个f:ajax中的searchBoxFN
),修复它,否则在使用{{{ 1}}它的f:ajax将尝试执行一个未被渲染的元素......(可能导致严重的问题......)
searchBoxFN
中的 prependId="false"
将简化jQuery中的选择器...
答案 2 :(得分:1)
问题是托管bean需要使用正确的签名事件作为输入参数进行设置。通过大量的测试,我试图使用相同的类来获取AjaxBehaviorEvent。与之前论坛上的相同示例一样。
当我声明一个ActionListener事件(符合按钮jsf动作)时,bean被执行了!
我遇到了同样的问题,并按照你的例子来帮助我。我只是(20小时)通过在我的bean中包含以下内容来解决这个问题:
第一个现在被解雇了!
public void actionListener(ActionEvent actionEvent) {
// Add event code here...
System.out.println("Made it!");
}
public void morePressed(AjaxBehaviorEvent e) {
System.out.println("Made it!");
}