在一个用于查看数据的JSF页面上,我将一个启用了排序和列重新排序的OpenFaces数据表保存到适当的支持bean属性中(通过o:dataTable元素上的sortColumnId、sortAscending、columnsOrder属性)。在相应的内联编辑页上(通过自定义代码,用户可以一次保存一行),数据表的columnsOrder链接到相同的属性,以便列以与视图页上相同的顺序出现,但o: column重新排序元素不存在于数据表中,以防止编辑页上的列重新排序。这是必需的,因为由于部分响应XML中的错误,由移动列发起的AJAX调用无法更新表。(还有其他要求,这意味着应该防止在编辑页面上通过AJAX更新表。)
我希望能够有在编辑页面上的数据表排序的相同顺序上的视图页面,但排序也被禁用。然而,这在OpenFaces中似乎是不可能的。我已经将编辑页面上的datable链接到相同的支持bean属性,但是为了使排序后的列显示为已排序,o:column标记需要有一个sortingExpression属性。当该属性被添加到列中时,用户可以通过单击列标题来对该列进行排序。如果没有添加,则用户不能对列进行排序,但是表也不会按该列进行排序,即使在支持bean属性中将其指定为要排序的列也是如此。
使用由JQuery运行的JavaScript创建DOM之后,我尝试覆盖由OpenFaces列标题的'th‘元素上的单击事件调用的函数,但在调用该函数后,仍会调用用于排序和刷新表的AJAX调用。使用的代码是:
在Edit.xhtml中:
<script type="text/javascript">
$(document).ready(function() {
$('#doorNumberColumnHeader').parents('th').onclick = null;
$('#doorNumberColumnHeader').parents('th').click(function(event) {
alert("Preventing AJAX call");
if (event) {
event.preventDefault ? event.preventDefault() : event.returnValue = false;
}
return false;
});
});
</script>在Edit.xthml的OpenFaces数据表中:
<o:column id="doorNumberColumn" sortingExpression="#{submission.doorNum}" fixed="true" width="50px">
<f:facet name="header">
<h:outputText value="#{bundle.SubmissionDoorNumber}" id="doorNumberColumnHeader"/>
</f:facet>
<h:outputText value="#{submission.doorNum}"/>
</o:column>有没有更好的方法来阻止AJAX调用来阻止用户更改表的排序顺序?
谢谢。
发布于 2012-04-03 00:14:38
对于那些可能感兴趣的人,我发现问题的答案是在创建DOM之后重写OpenFaces JavaScript _reload()函数。我知道这可能会阻止同一页面上的任何OpenFaces组件进行AJAX调用(尽管在有问题的页面上我只有一个数据表,所以这不是问题)。
<script type="text/javascript">
$(document).ready(function() {
// Prevent OpenFaces datatable component from sending AJAX requests!
window.OpenFaces.Ajax._reload = function(one, two, three) {
// Do nothing!
};
});
</script>此解决方案不会阻止在页面内进行其他AJAX调用,因此仍然可以使用a4j:commandButton。
https://stackoverflow.com/questions/9908241
复制相似问题