首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用更改已排序OpenFaces数据表的排序顺序的功能

禁用更改已排序OpenFaces数据表的排序顺序的功能
EN

Stack Overflow用户
提问于 2012-03-28 21:11:17
回答 1查看 836关注 0票数 1

在一个用于查看数据的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中:

代码语言:javascript
复制
<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数据表中:

代码语言:javascript
复制
<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调用来阻止用户更改表的排序顺序?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-03 00:14:38

对于那些可能感兴趣的人,我发现问题的答案是在创建DOM之后重写OpenFaces JavaScript _reload()函数。我知道这可能会阻止同一页面上的任何OpenFaces组件进行AJAX调用(尽管在有问题的页面上我只有一个数据表,所以这不是问题)。

代码语言:javascript
复制
<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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9908241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档