2013-11-20 6 views
1

У меня есть главная страница, как и содержит интересы составной компонент и ссылки для ленивых нагруженных вкладок следующим образом:не может сделать элементы в другой форме из внутри JQuery-вкладок динамически загружаемой вкладка

1- страницу профиля:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition template="../templates/application.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:o="http://omnifaces.org/ui" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:myapp="http://java.sun.com/jsf/composite/component" 
    xmlns:p="http://java.sun.com/jsf/passthrough"> 
     <ui:define name="head"> 
    <title>Profile</title> 
    <script type="text/javascript" src="https://www.google.com/jsapi"></script> 
    <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/assets/css/jquery/jquery-ui.css" media="screen"/> 
    <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/assets/css/override-jquery.css" media="screen"/> 
    <style> 
     li 
     { 
      outline: none !important; 
     }​ 
    </style> 
    </ui:define> 

<ui:define name="right-side"> 
    <div class="three-column right">   
    <myapp:interest bean="#{interestBean}" value="#{interestBean.interest}" id="interestCmp"></myapp:interest>    
    </div> 
</ui:define>  
<ui:define name="content"> 
    <div class="tabs"> 
     <ul> 
      <li><a id="tab1" href="tabs/tab1.xhtml">tab1</a></li> 
      <li><a id="tab2" href="tabs/tab2.xhtml">tab2</a></li> 
     </ul> 
    </div> 


<script type="text/javascript">head.ready(function(){$('.tabs').tabs();});</script> 
</ui:define> 
</ui:composition> 

2- интересы составной компонент:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 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:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
    <composite:attribute name="id" /> 
    <composite:attribute name="index" /> 
    <composite:attribute name="value" /> 
    <composite:attribute name="bean" /> 
</composite:interface> 

<composite:implementation xmlns:myapp="http://java.sun.com/jsf/composite/component"> 
<div > 
<aside class="interests"> 
    <header class="header-w-flag icon-star"> 
     <h1>Interests</h1> 
    </header> 
    <h:form id="interestForm"> 
    <h:panelGroup id="showInterests" layout="block"> 
    <ui:repeat var="interest" value="#{interestBean.getUserInterests()}" > 
     <div class="interest"> 
     <div class="interest-name"><a href="">#{interest.interestName}</a> 
     <h:commandLink action="#{interestBean.deleteInterest(interest)}" rendered="#{permissionBean.isCurrentUser(profileBean.user)}" > 
     <i class="icon-delete control-icon" style="cursor:pointer;display:none;"></i> 
     <f:ajax render="@form" execute="@this"></f:ajax> 
     </h:commandLink></div> 
     <div class="people-grid"> 
     <ui:repeat var="user" value="#{interestBean.getUsersByInterest(interest.id)}" varStatus="status" > 
     <h:panelGroup id="interestedUsers"> 
          <a title="#{user.firstName} #{user.lastName}" href="../profile/index.xhtml?id=#{user.id}"><img src="#{applicationBean.avatarBaseURL}#{user.avatarUrl}" alt="#{user.firstName}" /></a> 
     </h:panelGroup> 
     </ui:repeat> 
     </div> 


     </div> 
    </ui:repeat> 
    </h:panelGroup> 
    </h:form> 
</aside> 

     </div> 
</composite:implementation> 
</html> 

3- код tab1:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:o="http://omnifaces.org/ui" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:myapp="http://java.sun.com/jsf/composite/component" 
    xmlns:p="http://java.sun.com/jsf/passthrough"> 

    <div id="tab1"> 
      <!-- feed here --> 
      <h:panelGroup layout="block" class="posts" id="feedContainer"> 
      <h:form id="profileFeeds"> 
      <ui:repeat var="post" value="#{feedBean.feeds}" varStatus="status" > 
       <myapp:feedpost value="#{post}" index="{status.index}"></myapp:feedpost>  
      </ui:repeat> 
      <h:panelGroup layout="block" rendered="#{feedBean.feeds.size()==0}"> 
       <div class="post blue"> 
        <div class="post-content"> 

         <h1>Nothing</h1> 

        </div> 
       </div> 
      </h:panelGroup> 

      <div class="post load"><h:commandLink action="#{feedBean.getMoreHomeFeeds()}" styleClass="btn btn-primary btn-small">Show more feeds 
      <f:ajax render=":feedContainer" ></f:ajax> 
      </h:commandLink></div> 
      </h:form> 
     </h:panelGroup> 
    </div> 



</html> 

4- feedpost составной компонент, который связан с tab1:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 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:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
    <composite:attribute name="id" /> 
    <composite:attribute name="index" /> 
    <composite:attribute name="value" /> 

</composite:interface> 

<composite:implementation xmlns:myapp="http://java.sun.com/jsf/composite/component"> 
    <h:panelGroup layout="block" class="post"> 
    <div class="post-content">  




       <h:panelGroup layout="block"> 
         <h1><h:outputFormat value="#{cc.attrs.value.title}" /></h1> 
       </h:panelGroup> 

tText value="#{baseBean.replaceWithHTMLBreak(cc.attrs.value.note)}" escape="false"/></p> 
       </h:panelGroup> 


     </div> 
    <myapp:comments value="#{cc.attrs.value}"></myapp:comments> 
    </h:panelGroup> 
</composite:implementation> 

</html> 

5- комментарии составного компонента, который связан с feedpost компонента:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 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:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
    <composite:attribute name="id" /> 
    <composite:attribute name="index" /> 
    <composite:attribute name="value" />  
</composite:interface> 

<composite:implementation> 
     <h:panelGroup layout="block" class="comments" id="feedcomments"> 
     <div class="actions"> 

      <h:commandLink id="addToInterestLink" value="#{msg['action.addto.interests']}" styleClass="action-like" 
       action="#{feedBean.addToInterests(cc.attrs.value)}"> 
       <f:ajax execute="@this" render=":interestCmp:interestForm:showInterests"></f:ajax> 
      </h:commandLink> 

     </div> 
    </h:panelGroup> 
</composite:implementation> 

</html> 

при нажатии на ссылку tab1 (ленивым загружен вкладка JQuery), который содержит комментарии композиционный компонент, который имеет ссылку на оказание интересов DIV в процентной составляющей, я получаю следующее исключение:

<f:ajax> contains an unknown id ':interestCmp:interestForm:showInterests' - cannot locate it in the context of the component addToInterestLink 

Примечание: один обходной путь я нашел для выпуска заключается в добавьте содержимое tab1 статически на страницу, а не свяжите его.

, пожалуйста, сообщите, как это исправить.

+0

Вы, кажется, отредактировали код в своем вопросе в недопустимой форме. Использование ':' в идентификаторе компонента JSF приведет только к отправке IAE. В будущих вопросах, пожалуйста, скопируйте настоящий код без изменений. В противном случае вы только вводите красные сельди и путаницу. – BalusC

+0

@BalusC, я отправил правильный код сейчас, извините, я не понял код страницы правильно, тоже извините за смущение. Я обещаю, что больше не буду этого делать. –

+0

Есть 2 вещи, странные с этим кодом: 1) '' не использует префикс ':', но сообщение об ошибке упоминает об этом; вы все еще показываете настоящий код? 2) Вы подразумеваете, что он отлично работает, когда вы заменяете '' на что-то более простое, например «привет»? И есть одна нечеткость: это '' составной компонент с '' и т. Д.? Вы просто называете это «композицией», а не «составной». – BalusC

ответ

1

Хорошо, в двух словах и несколько упрощен (составные компоненты, на самом деле не играют роль в проблеме), ваша проблема здесь:

profile.xhtml:

<my:composite id="interestCmp"> <!-- Yes, invalid code; just to summarize. --> 
    <h:form id="interestForm"> 
     <h:panelGroup id="showInterests"> 
      ... 
     </h:panelGroup> 
    </h:form> 
</my:composite> 
<div class="tabs"> 
    <ul> 
     <li><a id="tab1" href="tabs/tab1.xhtml">tab1</a></li> 
     <li><a id="tab2" href="tabs/tab2.xhtml">tab2</a></li> 
    </ul> 
</div> 
<script>head.ready(function(){$('.tabs').tabs();});</script> 

И где-то в tab1.xhtml

<h:form id="profileFeeds"> 
    <h:commandLink value="Add"> 
     <f:ajax render=":interestCmp:interestForm:showInterests" /> 
    </h:commandLink> 
</h:form> 

Таким образом, вы используете jQuery UI tabs, чтобы иметь панель с динамическим контентом. Однако на закладке tab1.xhtml не отображается одно и то же представление JSF как основная страница profile.xhtml. Это физически совершенно разные взгляды. Это полностью объясняет, почему не смог найти желаемый компонент в дереве компонентов (текущий вид). Он может видеть только компоненты, которые содержатся в tab1.xhtml. Он не видит те из profile.xhtml. Его даже не видно в tab2.xhtml.

Он будет работать, только если вы предварительно загрузите вкладки на <ui:include> вместо их динамической загрузки. Таким образом, tab1.xhtml физически окажется в том же виде, что и желаемый компонент. Предположим, что вам нужно сделать это только для tab1.xhtml, а tab2.xhtml можно сохранить динамически.Это должно затем решить вашу проблему:

<div class="tabs"> 
    <ul> 
     <li><a id="tab1" href="#tab1_page">tab1</a></li> 
     <li><a id="tab2" href="tabs/tab2.xhtml">tab2</a></li> 
    </ul> 
    <div id="tab1_page"> 
     <ui:include src="tabs/tab1.xhtml" /> 
    </div> 
</div> 

Вам нужно только заменить <?xml...?><!DOCTYPE ...><html xmlns...> и </html> из tab1.xhtml (и на самом деле также tab2.xhtml) по <ui:composition xmlns...> и </ui:composition> соответственно. Потому что в противном случае вы оказываетесь в синтаксически недействительном HTML.

Если вы действительно нужно иметь динамически/лениво загружаются вкладки, то лучше искать компонент JSF fullworthy способный к работе, например, PrimeFaces <p:tabView>. Более того, PrimeFaces использует jQuery/UI под обложками для look'n'feel, поэтому многие вещи будут очень похожи на текущий подход.

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

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