2015-03-05 7 views
1

У меня есть файл тега Facelet и вам нужно отображать разные компоненты в зависимости от того, указан ли атрибут или нет. Я попробовал его, как показано ниже,Условный рендер в файле тега в зависимости от того, указан ли атрибут или нет

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:pe="http://primefaces.org/ui/extensions" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 

    <h:panelGrid columns="1"> 
     <p:outputLabel value="test1" rendered="#{empty myParam}" /> 
     <p:outputLabel value="test2" rendered="#{not empty myParam}" /> 
    </h:panelGrid> 
</ui:composition> 

Который используется, как показано ниже,

<mt:myTag myParam="#{myManagedBean.someProperty}" /> 

Однако, это не сработало. Он принимает оценочное значение #{myManagedBean.someProperty}. Если он пуст, то он все еще показывает test1. Как я могу проверить, действительно ли установлен атрибут myParam?

ответ

1

Создайте еще один пользовательский тег с классом taghandler, который проверяет наличие определенного атрибута в переменном mapper текущего контекста Facelet и устанавливает логическое значение в области Facelet, указывающее на наличие нужного атрибута. Наконец, используйте его в своем файле тегов.

E.g.

<my:checkAttributePresent name="myParam" var="myParamPresent" /> 
<h:panelGrid columns="1"> 
    <p:outputLabel value="test1" rendered="#{not myParamPresent}" /> 
    <p:outputLabel value="test2" rendered="#{myParamPresent}" /> 
</h:panelGrid> 

С помощью этого тега обработчика:

public class CheckAttributePresentHandler extends TagHandler { 

    private String name; 
    private String var; 

    public CheckAttributePresentHandler(TagConfig config) { 
     super(config); 
     name = getRequiredAttribute("name").getValue(); 
     var = getRequiredAttribute("var").getValue(); 
    } 

    @Override 
    public void apply(FaceletContext context, UIComponent parent) throws IOException { 
     context.setAttribute(var, context.getVariableMapper().resolveVariable(name) != null); 
    } 

} 

, который зарегистрирован как показано ниже в вашем .taglib.xml:

<tag> 
    <tag-name>checkAttributePresent</tag-name> 
    <handler-class>com.example.CheckAttributePresentHandler</handler-class> 
    <attribute> 
     <name>name</name> 
     <required>true</required> 
     <type>java.lang.String</type> 
    </attribute> 
    <attribute> 
     <name>var</name> 
     <required>true</required> 
     <type>java.lang.String</type> 
    </attribute> 
</tag> 

 Смежные вопросы

  • Нет связанных вопросов^_^