[ 
https://issues.apache.org/jira/browse/MYFACES-3659?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13534274#comment-13534274
 ] 

Leonardo Uribe commented on MYFACES-3659:
-----------------------------------------

The problem of use a list of resources is that we need to add that info into 
the state and that makes state bigger without need. 

The idea of renderTarget is detect when a change on the component tree was 
done, and if a resource was added just render the affected part (head or body), 
in a transparent way.

Take a look at these two classes:

org.apache.myfaces.renderkit.html.HtmlScriptRenderer
org.apache.myfaces.renderkit.html.HtmlStylesheetRenderer

Note the trick uses PostAddToViewEvent, but it does not consider 
PreRemoveFromViewEvent, which is the one you want. I think it is quite simple 
to implement it, because you already have the most difficult one.

This approach also requires a code in 
org.apache.myfaces.context.servlet.PartialViewContextImpl method 
processPartialRendering() that checks for a change in a component render facet 
(head or body) and traverse the tree according.

The flaw is that JSF libraries that override js part, usually override 
PartialViewContextImpl, ignoring this implementation detail. But note once you 
know the code, it should be quite simple to create an alternate implementation 
of PartialViewContext that include the necessary lines, but that is outside 
MyFaces Core scope.
                
> Conditional include of scripts and stylesheets 
> -----------------------------------------------
>
>                 Key: MYFACES-3659
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3659
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.1.6
>         Environment: MyFaces 2.1.6, Tomahawk20 1.1.11
>            Reporter: dennis hoersch
>
> I am inserting a script 'X.js' dependent on a condition (c:if). The default 
> case is to include it. If I change the underlying value within an action so 
> that the condition evaluates to false, the script is still included. Also 
> after any other following action.
> Using F5 in Firefox the page is now rendered without the script.
> The script 'X.js' was added to the view root and is never 'forgot' or 
> removed. It is the same if the script is included in a composite component. 
> In that case I even observed that the order of the scripts changes and the 
> script 'X.js' is included before other basic scripts like jQuery on which 
> 'X.js' depends.
> ----
> <h:form id="form">
>   <c:set var="sessionScope" 
> value="#{facesContext.externalContext.sessionMap}" />
>     
>   <h:commandButton value="deactivate"
>       rendered="#{empty sessionScope.__isActive_ or 
> sessionScope.__isActive_}">
>       <f:setPropertyActionListener target="#{sessionScope.__isActive_}" 
> value="#{false}" />
>   </h:commandButton>
>   <h:commandButton value="activate"
>       rendered="#{not empty sessionScope.__isActive_ and not 
> sessionScope.__isActive_}">
>       <f:setPropertyActionListener target="#{sessionScope.__isActive_}" 
> value="#{true}" />
>   </h:commandButton>
>     
>   <h:commandButton value="do nothing" />
>     
>   <h:outputScript library="js" name="jQuery.js" target="body" />
>     
>   <c:if test="#{empty sessionScope.__isActive_ or sessionScope.__isActive_}">
>     BLA
>     <h:outputScript library="js" name="X.js" target="body" />
>     </c:if>      
> </h:form>
> ----
> Am I doing something wrong? Is there another (or better) way to include 
> scripts conditionally?
> (
> If I change 'HtmlOutputScriptHandler' to set the script transient, it works 
> in the first glance, but I don't know the impact...
> @Override
> public void onComponentPopulated(FaceletContext ctx, UIComponent c, 
> UIComponent parent) {
>     super.onComponentPopulated(ctx, c, parent);
>     c.setTransient(true);
> }
> )

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to