【问题标题】:is any way to abort AjaxBehaviorEvent listener or pass additional info to f:ajax onevent?有什么方法可以中止 AjaxBehaviorEvent 侦听器或将附加信息传递给 f:ajax onevent?
【发布时间】:2014-03-12 11:49:33
【问题描述】:

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

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 函数隐藏。

【问题讨论】:

    标签: java javascript ajax jsf


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我以同样的方式完成了它,它有效并解决了我的问题。但是 imo 更好的解决方案是将一些东西从侦听器传递给在 onevent 中调用的 JavaScript 函数,你知道该怎么做吗?我尝试使用谷歌搜索,但没有发现任何有用的东西。但完成总比完美好,感谢您的帮助。
    • 你可以将额外的参数传递给onevent(和onerror),但不是EL表达式(据我所知)onevent="function (data) { myFunction(data, 'extra 1', 'extra 2'); }"跨度>
    • 是的,但是这样我只能在 JS 中传递参数,而不是从侦听器派生的。无论如何感谢您的时间。最好的问候。
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多