JSF f:没有调用ajax监听器

时间:2012-03-24 00:56:16

标签: ajax jsf listener

当我点击一个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="&#x25b8;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上。我仍然现在知道为什么这会导致它破裂,但是,嘿,无论有什么用。

3 个答案:

答案 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!");
}