2013-08-20 2 views
1

Я пытаюсь создать составной компонент paginator. Компонент должен отображать commandLink для каждой доступной страницы. Это выглядит примерно так:Как настроить таргетинг на командуLink, вложенную внутри ui: repeat в составном компоненте?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:cc="http://java.sun.com/jsf/composite" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <cc:interface> 
     <cc:attribute name="action" targets="jumpButton" required="true"/> 
     <cc:attribute name="bean" type="java.lang.Object" required="true"/> 
    </cc:interface> 
    <cc:implementation> 
     <ui:repeat value="#{cc.attrs.bean.pages}" var="page"> 
      <h:commandLink id="jumpButton" 
          actionListener="#{cc.attrs.bean.jumpToPage(page)}"> 
       <h:outputText value="#{page}"/> 
      </h:commandLink> 
     </ui:repeat> 
    </cc:implementation> 
</html> 

компонент используется в различных страницах, как это:

<ccc:paginator bean="#{myBean}" 
       action="/index?faces-redirect=true&amp;includeViewParams=true"/> 

Или:

<ccc:paginator bean="#{myOtherBean}" 
       action="/dir/index?faces-redirect=true&amp;includeViewParams=true"/> 

Обратите внимание на использование граней-редиректа = истина и includeViewParams = true, который, насколько я знаю, не может быть использован непосредственно в командных ссылках в составном компоненте.

Проблема в том, что jumpButton не может быть целевым, потому что он находится внутри ui: repeat. Я получаю сообщение:

javax.servlet.ServletException: /index?faces-redirect=true&includeViewParams=true : Unable to re-target MethodExpression as inner component referenced by target id 'jumpButton' cannot be found. 

Если я создаю ссылку команду с идентификатором = «jumpButton» вне Ui: повторить, составной компонент и кнопка работает нормально. Как я могу заставить свой составной компонент работать с командной связью внутри ui: repeat?

Решение

действие jumpToPage управляемом бина:

public String jumpToPage(String path, Integer page) { 
    ... 
    setCurrentPage(page); 
    return path; 
} 

Составной компонент:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:cc="http://java.sun.com/jsf/composite" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <cc:interface> 
     <cc:attribute name="bean" type="java.lang.Object" required="true"/> 
     <cc:attribute name="path" type="java.lang.String" required="true"/> 
    </cc:interface> 
    <cc:implementation> 
     <ui:repeat value="#{cc.attrs.bean.pages}" var="page"> 
      <h:commandLink id="jumpButton" 
          action="#{cc.attrs.bean.jumpToPage(cc.attrs.path, page)}"> 
       <h:outputText value="#{page}"/> 
      </h:commandLink> 
     </ui:repeat> 
    </cc:implementation> 
</html> 

компонентов Примеры использования:

<ccc:paginator bean="#{myBean}" 
       path="/index?faces-redirect=true&amp;includeViewParams=true"/> 
<ccc:paginator bean="#{myOtherBean}" 
       path="/dir/index?faces-redirect=true&amp;includeViewParams=true"/> 

ответ

2

Вы должны удалить атрибут действия в пределах <cc:interface>. Это не нужно, так как вы вызываете действие через атрибут bean.

Update 1

И результат действия можно также определить как возвращаемое значение вашего компонента. Как это:

public class MyBean { 
    public String jumpToPage(int page){ 
     // ... 
     return "/index?faces-redirect=true&amp;includeViewParams=true"; 
    } 
} 

, а затем использовать action вместо actionListener:

<h:commandLink id="jumpButton" action="#{cc.attrs.bean.jumpToPage(page)}"> 
    <h:outputText value="#{page}"/> 
</h:commandLink> 
+0

Спасибо, я сделал некоторые изменения в оригинальный вопрос. Насколько я знаю, для меня невозможно использовать '? Faces-redirect = true & includeViewParams = true' в командных ссылках в составном компоненте напрямую. Если бы не это, ваше предложение работает. Но важна роль '? Faces-redirect = true & includeViewParams = true' части страницы. –

+0

см. Мое обновление. Вам по-прежнему не нужен атрибут action на вашем компоненте. – fischermatte

+0

Спасибо! Так просто. Не могу поверить, что я сделал это настолько сложным. Я обновил свой вопрос с результатом. Он работает отлично. –

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

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