在用于查看数据的JSF页面上,我有一个OpenFaces数据表,其中启用了排序和列重新排序,保存到适当的支持bean属性(通过:o:dataTable元素上的sortColumnId,sortAscending,columnsOrder属性)。在相应的内联编辑页面(通过自定义代码,用户可以一次保存一个表的各个行),数据表的columnsOrder链接到同一属性,因此列的显示顺序与查看页面,但o:columnReordering元素不存在于数据表中,以防止在编辑页面上进行列重新排序。这是必需的,因为由于部分响应XML中的错误,移动列启动的AJAX调用因更新表而失败。 (还有其他要求,这意味着应该阻止在编辑页面上通过AJAX更新表。)
我希望能够让编辑页面上的数据表按照与视图页面相同的顺序排序,但也禁用排序。但是,在OpenFaces中似乎不可能。我已将编辑页面上的datable链接到相同的backing bean属性,但是对于要显示为已排序的已排序列,o:column标记需要具有sortingExpression属性。将该属性添加到列后,该列可以由用户单击列标题进行排序。如果未添加,则该列不能由用户排序,但该表也不按该列排序,即使它在backing bean属性中指定为要排序的列。
在创建DOM之后使用JQuery运行的JavaScript,我尝试覆盖OpenFaces列标题的'th'元素上的click事件调用的函数,但在调用该函数之后,调用了AJAX调用刷新表仍然被调用。使用的代码是:
<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调用阻止用户更改表的排序顺序?
感谢。
答案 0 :(得分:1)
对于那些可能感兴趣的人,我发现我的问题的答案是在创建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。