我正在使用Primefaces和JSF2.2开发一个动态菜单。
问题是它没有插入菜单id。查看primefaces的代码时,它会碰到一个始终为假的代码:
BaseMenuRenderer:
protected boolean shouldRenderId(MenuElement element) {
if(element instanceof UIComponent)
return shouldWriteId((UIComponent) element);
else
return false;
}TieredMenuRenderer:
writer.startElement("li", null);
if(shouldRenderId(submenu)) {
writer.writeAttribute("id", submenu.getClientId(), null);
}因此,我决定重写primefaces的TieredMenuRenderer,但是我的重写构造函数类被调用,但是重写方法从未被调用。
下面是我如何设置我的facesconfig.xml
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.TieredMenuRenderer</renderer-type>
<renderer-class>ui.jsf.TieredMenuRenderer</renderer-class>
</renderer>
</render-kit>我的重写课程:
public class TieredMenuRenderer extends org.primefaces.component.tieredmenu.TieredMenuRenderer {
@Override
protected void encodeElements(FacesContext context, AbstractMenu menu, List<MenuElement> elements) throws IOException {
System.out.println("----------- TEST --------------");
super.encodeElements(context, menu, elements);
}赛斯奥特从不打印。
有人知道我做错了什么吗?
谢谢!
编辑:
向DefaultMenuItem添加ID:
DefaultMenuItem item = new DefaultMenuItem();
item.setId(menuItem.getMenuId());// just return a string value.添加菜单xhtml后,"menucontroller.model“是我使用DefaultMenuModel的primefaces MenuModel:
在执行以下命令时,迭代呈现器工具包,将返回正确的呈现器类型org.primefaces.component.TieredMenuRenderer。
Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");执行以下代码时,返回限定类名ui.jsf.TieredMenuRenderer@64baec0e
Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");发布于 2017-04-10 16:28:21
首先,我的渲染器没有覆盖正确的渲染器。当我应该重写org.primefaces.component.tieredmenu.TieredMenuRenderer时,我正在重写org.primefaces.component.MenubarRenderer。
然后,为了纠正primefaces id问题,我在呈现的类中执行了以下操作:
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}EncodedEnd从覆盖我的ids的素数面调用"generateIds()“。
完整呈现类:
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.menu.AbstractMenu;
import org.primefaces.model.menu.MenuElement;
public class MenuRenderer extends org.primefaces.component.menubar.MenubarRenderer {
@Override
protected boolean shouldRenderId(MenuElement element) {
return true;
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
AbstractMenu menu = (AbstractMenu) component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
}https://stackoverflow.com/questions/43193255
复制相似问题