我已经在控制器中创建了监听器,就像这样。
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' && #{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函数隐藏。
这里有一个小技巧来解决你的特定问题:
- 在
<h:form>
和<h:commandButton ... />
中创建一个<h:inputHidden id="closeDialogFlag" value="#{fooController.closeDialogFlag}"/>
。这里,我假设#{fooController.closeDialogFlag}
是boolean
类型。 - 在你的f:ajax:
- 渲染组件
closeDialogFlag
。 - 将onevent中的条件更改为:
function(data){ if(data.status === 'success' && $('input#closeDialogFlag').val() === 'true') { $('#migrationEditDialogModal').modal('hide'); } }
- 渲染组件
您必须更改$('input#closeDialogFlag')
以指向正确的ID(将取决于父母的ID)。
这是有效的,因为当data.status === 'success'
时,组件已经用它们的新值呈现了。