Java 有没有办法中止AjaxBehaviorEvent侦听器或将其他信息传递给f:AjaxOneEvent?

Java 有没有办法中止AjaxBehaviorEvent侦听器或将其他信息传递给f:AjaxOneEvent?,java,javascript,ajax,jsf,Java,Javascript,Ajax,Jsf,我已经在我的控制器中创建了监听器,类似的 public class FooController { public void doSomething(AjaxBehaviorEvent evt) { closeDialogFlag = true; .. if(!isValid){ closeDialogFlag = false; } } } 还有我的JSF按钮 <h:commandBut

我已经在我的控制器中创建了监听器,类似的

public class FooController {
    public void doSomething(AjaxBehaviorEvent evt) {
        closeDialogFlag = true;
        ..
        if(!isValid){
            closeDialogFlag = false;
        }
    }
}
还有我的JSF按钮

<h:commandButton value="Do somenthing">
    <f:ajax 
        listener="#{fooController.doSomething}"
        execute=":editDialogForm:processTab" render="@this :editDialogForm:processTab :messageViewer:messageViewerPanel :results"
        onevent="function(data){ if(data.status === 'success' &amp;&amp; #{fooController.closeDialogFlag} ) { $('#migrationEditDialogModal').modal('hide'); } }"
    />
</h:commandButton>

但是我的
closeDialogFlag
在ajax请求完成后不起作用,因为值
{fooController.closeDialogFlag}
是在页面加载时提取的,在ajax请求后不会更新。我需要刷新页面以查看输出代码中的新值

问题是: 如何将附加信息传递到侦听器中的
onevent=function(data)
中的
data
?(此解决方案更适合我,因为它在各种情况下都很有用)是在侦听器中中止我的请求并强制我的AJAX请求返回另一种状态而不是
成功

PS:我不想使用Primefaces、Richfaces等

编辑: 小修正。
如果我将
f:ajax
添加到属性
render
value
@this
,那么我的标志将成功提取为
true
,但事实上,在我的ajax请求之后,我的对话框不会被JavaScript函数隐藏。

下面是解决您具体问题的一个小技巧:

  • 在与您的
    相同的
    中创建一个
    。在这里,我假设
    #{fooController.closeDialogFlag}
    boolean
    类型
  • 在f:ajax中:
  • 呈现组件
    closeDialogFlag
  • 将OneEvent中的条件更改为:
    function(data){if(data.status=='success'&;$('input#closeDialogFlag').val()=='true'){$('migrationedidialogmodal').modal('hide');}}
  • 您必须将
    $('input#closeDialogFlag')
    更改为指向正确的ID(取决于家长的ID)


    这是因为当
    data.status==“success”
    时,组件已经用它们的新值进行了渲染。

    我用同样的方法进行了渲染,它工作了,解决了我的问题。但我认为更好的解决方案是将监听器中的内容传递给JavaScript函数,该函数在
    onevent
    中调用,您知道怎么做吗?我试着用谷歌搜索,但没有发现任何有用的东西。但是仍然完成总比完美好,谢谢你的帮助。你可以将额外的参数传递给
    onevent
    (和
    onerror
    ),但不能传递EL表达式(据我所知)
    onevent=“function(data){myFunction(data,'extra 1','extra 2');}”
    是的,但这样我只能传递JS中的参数,不是从侦听器派生的。无论如何,谢谢你抽出时间。顺致敬意,