InputText PrimeFaces不应用maxlength

Jac*_*Dev 6 html5 primefaces jsf-2 primefaces-mobile

我正在使用PrimeFaces 3.4和PrimeFaces Mobile 0.9.3.我在inputText属性中指定了maxlength,但它没有在HTML中呈现.我的代码:

<p:inputText id="price" value="#{bean.price}" styleClass="r-align" 
type="number" maxlength="9" validator="priceValidator"/>
Run Code Online (Sandbox Code Playgroud)

后来我发现当我从标签中删除"type"属性时,max length有效.有谁知道为什么会这样?

Bal*_*usC 11

这只是因为HTML5 元素maxlength不支持属性,所以假设PrimeFaces渲染器不会发射它是合理的.<input type="number">

相反,你应该使用minmax属性.从理论上讲,你应该被设置

<p:inputText type="number" max="999999999" />
Run Code Online (Sandbox Code Playgroud)

但是,这对我不起作用.它没有完全呈现max(也不是min)属性.这反过来可能是PrimeFaces组件的疏忽.你最好的选择是将它作为一个问题报告给PrimeFaces的人.

同时,你可以通过提供这样的自定义渲染器来解决这个问题,它基本上将minmax属性添加到pass thru属性列表中:

package com.example;

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.primefaces.component.inputtext.InputTextRenderer;

public class MyInputTextRenderer extends InputTextRenderer {

    @Override
    protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
        String[] newAttrs = new String[attrs.length + 2];
        System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
        newAttrs[newAttrs.length - 2] = "min";
        newAttrs[newAttrs.length - 1] = "max";
        super.renderPassThruAttributes(facesContext, component, newAttrs);
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以通过如下注册来运行它:

<render-kit>
    <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.InputTextRenderer</renderer-type>
        <renderer-class>com.example.MyInputTextRenderer</renderer-class>
    </renderer>
</render-kit>
Run Code Online (Sandbox Code Playgroud)

请注意,在即将推出的JSF 2.2中,本机支持传递自定义JSF组件属性,这允许HTML5 data-*属性自由.

也可以看看: