Использование тегов, связанных с начальной загрузкой, внутри компонента JSF2 h:inputText

Есть ли способ использовать теги, связанные с начальной загрузкой, в компонентах JSF2? Например, я заинтересован в использовании функции начальной загрузки начальной загрузки, которая требует что-то вроде

<h:inputText id="typeahead" type="text" data-provide="typeahead"></h:inputText>

но с тех пор data-provide не существует для h:inputText он удаляется, и поэтому функция typeahead явно не будет работать.

1 ответ

Решение

Зависит от используемой вами версии JSF.

В JSF 2.0/2.1 невозможно указать дополнительные атрибуты. Средства визуализации JSF HTML будут отображать только предопределенные атрибуты. Вам нужно создать пользовательский рендер, чтобы достичь желаемой работы. Чтобы свести к минимуму стандартный код, вы должны расширить рендерер для конкретной реализации. Неясно, какой из них вы используете, так что вот только целевой пример Mojarra:

import com.sun.faces.renderkit.html_basic.TextRenderer;

public class MyTextRenderer extends TextRenderer {

    @Override
    protected void getEndTextToRender(FacesContext context, UIComponent component, String currentValue) throws IOException {
        Object dataProvide = component.getAttributes().get("data-provide");

        if (dataProvide != null) {
            context.getResponseWriter().writeAttribute("data-provide", dataProvide, null);
        }

        super.getEndTextToRender(context, component, currentValue);
    }

}

Зарегистрируйте это следующим образом в faces-config.xml чтобы заставить его работать:

<render-kit>
    <renderer>
        <component-family>javax.faces.Input</component-family>
        <renderer-type>javax.faces.Text</renderer-type>
        <renderer-class>com.example.MyTextRenderer</renderer-class>
    </renderer>
</render-kit>    

В JSF 2.2 это возможно благодаря новым passthrough пространство имен или <f:passThroughAttribute> тег. Смотрите также Что нового в JSF 2.2? - Сквозные атрибуты HTML5.

Итак, так:

<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputText id="typeahead" a:data-provide="typeahead" />

(обратите внимание, что type атрибут по умолчанию text уже)

Или же:

<h:inputText id="typeahead">
    <f:passThroughAttribute name="data-provide" value="typeahead" />
</h:inputText>

Смотрите также:

Другие вопросы по тегам