有没有办法中止AjaxBehaviorEvent监听器或将其他信息传递给f:ajax onevent?

时间:2014-03-12 11:49:33

标签: java javascript ajax jsf

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

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请求后没有更新。我需要刷新页面以查看输出代码中的新值。

问题是: 如何将其他信息传递给我的听众data中的onevent=function(data)? (这个解决方案对我来说更合适,因为它在各种情况下都很有用) OR 有没有办法在我的监听器中中止我的请求并强制我的AJAX请求返回另一个状态而不是success

PS:我不想使用Primefaces,Richfaces等。

修改: 小修正。 如果我将f:ajax添加到属性render@this,那么我的标志会成功提取为true,但实际上在我的AJAX请求之后我的对话框没有被JavaScript隐藏功能

1 个答案:

答案 0 :(得分:0)

这是针对您的具体问题的一个小技巧:

  1. 在与<h:inputHidden id="closeDialogFlag" value="#{fooController.closeDialogFlag}"/>相同的<h:form>中创建<h:commandButton ... />。在这里,我认为#{fooController.closeDialogFlag}的类型为boolean
  2. 在你的f:ajax:
    1. 渲染组件closeDialogFlag
    2. 将您的条件更改为:function(data){ if(data.status === 'success' &amp;&amp; $('input#closeDialogFlag').val() === 'true') { $('#migrationEditDialogModal').modal('hide'); } }
  3. 您必须更改$('input#closeDialogFlag')以指向正确的ID(取决于父母的身份)。

    这是有效的,因为在data.status === 'success'时,组件已经使用新值进行渲染。