1

是否可以通过自定义将此类验证应用于dataTablePrimefaces 提供的过滤文本框。

这个文本框可以容纳的最大字符数可以通过使用 的filterMaxLength="45"属性来设置<p:column>。例如。

<p:column headerText="headerText" sortBy="#{obj.properyName}" filterMaxLength="45" filterBy="#{obj.properyName}">
    <h:outputText value="#{obj.properyName}" />
</p:column>

我看不到这样的属性来执行其他类型的验证,例如只允许特定字符,可能是通过使用正则表达式。

无论如何,我需要允许它只有数字,因为 MySQL 数据库中有一个id类型BIGINT(主键,自动增量)的列映射到Long实体类中的数据类型。

Primefaces 是否支持它,还是有办法自定义它?

4

2 回答 2

2

AFAIK Primefaces 没有这个选项。你可以使用javascript来解决这个问题。

您必须为要限制的列设置 id,输入(用于过滤器)的默认 id 为filter,然后您处理keydown event以仅允许数字。例如,我创建一个表单(id="form"),并嵌套一个数据表(id="cars"),一个列(id="cl2"),输入的 id 是filter,然后我绑定keydown event过滤用户键入的键:

<h:form id="form">
<script type="text/javascript">
                //<![CDATA[
                $(document).ready(function() {
                    $("#form\\:cars\\:cl2\\:filter").keydown(function(event) {
                        // Allow: backspace, delete, tab, escape, and enter
                        if ( event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 || 
                            // Allow: Ctrl+A
                        (event.keyCode == 65 && event.ctrlKey === true) || 
                            // Allow: home, end, left, right
                        (event.keyCode >= 35 && event.keyCode <= 39)) {
                            // let it happen, don't do anything
                            return;
                        }
                        else {
                            // Ensure that it is a number and stop the keypress
                            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105 )) {
                                event.preventDefault(); 
                            }   
                        }
                    });
                });
                //]]>
            </script>
<p:dataTable id="cars">
      <p:column id="cl2" headerText="MANUFAC" filterMatchMode="contains" filterBy="#{carr.manufacturer}">  
</p:dataTable>

另请参阅如何使用 jQuery 在 HTML 输入框中只允许数字 (0-9)?

于 2013-05-15T09:07:47.120 回答
0

扩展荣阮的答案。

在您的 javascript 方法中,找到该Filter组件。filterStyleClass您可以使用属性 on而不是向下导航 DOM 树元素p:column

这是一个例子:

<p:column id="cl2" headerText="MANUFAC" filterStyleClass="filterNumbersOnly" filterMatchMode="contains" filterBy="#{carr.manufacturer}"> 

在您的 JS 方法中,您可以使用该类来获取元素:

<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
    $(".filterNumbersOnly").keydown(function(event) {
        //Your logic to restrict numbers only goes here
    }
})
</script>

优点是因为此方法是基于 CSS 类的元素选择。您可以在应用程序中编写此 JS 函数一次,并将此类应用为:filterStyleClass="filterNumbersOnly"在整个应用程序或页面中的任意数量的列上。

于 2017-11-20T06:59:21.117 回答