Ada*_*dam 6 html jsf primefaces servlet-3.0 jsf-2
我在JSF 2中使用Primefaces 3来制作搜索框.我需要向控件添加一个非标准属性(x-webkit-speech),这样你就会有这样的东西......
<p:autoComplete x-webkit-speech="x-webkit-speech" ... />
Run Code Online (Sandbox Code Playgroud)
由于此属性不是autoComplete控件的一部分,因此JSF给出了500错误.但是当我删除它时,页面渲染得很好.通常,如何在JSF标记上指定传递属性,以便忽略它们?
设计JSF在呈现HTML时忽略所有自定义属性.您需要一个自定义渲染器.这是PrimeFaces <p:autoComplete>(以及所有其他组件)的情况,幸运的是相对简单.只需覆盖renderPassThruAttributes()您要添加要为attrs参数渲染的新属性并最终委托给super方法的方法就足够了.
例如
package com.example;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.autocomplete.AutoCompleteRenderer;
public class MyAutoCompleteRenderer extends AutoCompleteRenderer {
@Override
protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
String[] newAttrs = new String[attrs.length + 1];
System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
newAttrs[attrs.length] = "x-webkit-speech";
super.renderPassThruAttributes(facesContext, component, newAttrs);
}
}
Run Code Online (Sandbox Code Playgroud)
要使其运行,请在您的webapp中将其注册如下faces-config.xml:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.AutoCompleteRenderer</renderer-type>
<renderer-class>com.example.MyAutoCompleteRenderer</renderer-class>
</renderer>
</render-kit>
Run Code Online (Sandbox Code Playgroud)
(你可以通过查看AutoComplete类的源代码找到组件系列和渲染器类型,它们被指定为COMPONENT_FAMILY和RENDERER_TYPE常量)
不,@FacesRenderer当目的是覆盖自己已经注册的自定义渲染器时,注释根本不起作用faces-config.xml.
| 归档时间: |
|
| 查看次数: |
9625 次 |
| 最近记录: |