是任何方式中止AjaxBehaviorEvent监听器或传递额外的信息给f:ajax onevent



我已经在控制器中创建了监听器,就像这样。

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请求返回比success的另一个状态?

PS:我不想使用Primefaces, Richfaces等

编辑:小的调整。如果我添加到我的f:ajax属性render@this,那么我的标志被成功提取为true,但事实上,在我的AJAX请求后,我的对话框没有被JavaScript函数隐藏。

这里有一个小技巧来解决你的特定问题:

  1. <h:form><h:commandButton ... />中创建一个<h:inputHidden id="closeDialogFlag" value="#{fooController.closeDialogFlag}"/>。这里,我假设#{fooController.closeDialogFlag}boolean类型。
  2. 在你的f:ajax:
    1. 渲染组件closeDialogFlag
    2. 将onevent中的条件更改为:function(data){ if(data.status === 'success' &amp;&amp; $('input#closeDialogFlag').val() === 'true') { $('#migrationEditDialogModal').modal('hide'); } }

您必须更改$('input#closeDialogFlag')以指向正确的ID(将取决于父母的ID)。

这是有效的,因为当data.status === 'success'时,组件已经用它们的新值呈现了。

相关内容

  • 没有找到相关文章

最新更新