InputText PrimeFaces не применяет maxlength

Я использую PrimeFaces 3.4 с PrimeFaces Mobile 0.9.3. Я указал maxlength в атрибуте inputText, но не обрабатывается в HTML. Мой код:

<p:inputText id="price" value="#{bean.price}" styleClass="r-align" 
type="number" maxlength="9" validator="priceValidator"/>

Позже я обнаружил, что когда я удаляю атрибут "type" из тега, работает max length. Кто-нибудь знает, почему это так?

Ответ 1

Это просто потому, что атрибут maxlength не поддерживается в элементе HTML5 <input type="number">, поэтому разумно предположить, что рендеринг PrimeFaces выиграл 't испускать его.

Вместо этого вы должны использовать атрибуты min и max. Теоретически, вы должны быть установлены с помощью

<p:inputText type="number" max="999999999" />

Однако это не сработало для меня. Он не отобразил атрибут max (или min). Это, в свою очередь, вероятно, является надзором в компоненте PrimeFaces. Лучше всего сообщить об этом как о проблеме для парней PrimeFaces.

В то же время вы можете это сделать, предоставив собственный визуализатор, подобный этому, который в основном добавляет атрибуты min и max в список атрибутов pass throughru:

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);
    }

}

которую вы можете запустить, зарегистрировав его следующим образом:

<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>

Обратите внимание, что прохождение через пользовательские атрибуты компонента JSF будет поддерживаться в исходном JSF 2.2, что позволяет, среди прочего, свободу HTML5 data-*.

См. также:

Ответ 2

Есть работа, которую вы должны сыграть с maxValue:

Например, если ваша максимальная длина равна: 8, вы должны указать максимальное значение как: 99999999, которое является числом с 8 цифрами.

<p:inputNumber value="#{configBean.dependenciaUtils.selected.numTelefonoDependencia}"
                                       required="true"
                                       requiredMessage="Put a value"
                                       maxlength="8"    
                                       maxValue="99999999"
                                       thousandSeparator=""
                                       decimalPlaces="0"
                                       />

Ответ 3

<p:inputNumber maxlength="6" 
               maxValue="999999" 
               padControl="false" 
               thousandSeparator=""></p:inputNumber>

Установите maxlength и MaxValue чтобы установить максимальную длину для Primefaces inputnumber