1

无论如何在 JSF2 组件中使用引导相关的标签吗?例如,我有兴趣使用需要类似的 bootstrap typeahead 功能

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

但是因为data-provide它不存在,h:inputText所以它被剥离了,所以 typeahead 功能显然不起作用。

4

1 回答 1

4

取决于您使用的 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>

也可以看看:

于 2013-02-18T12:02:23.223 回答