myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Werner Punz (JIRA)" <...@myfaces.apache.org>
Subject [jira] Issue Comment Edited: (MYFACES-2640) (JSF.js) Ajax Render component problem, replace with whole fragment not one element.
Date Tue, 06 Apr 2010 09:49:34 GMT

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

Werner Punz edited comment on MYFACES-2640 at 4/6/10 9:48 AM:
--------------------------------------------------------------

Ok this usecase can happen on component level.

Ok lets sum this up, if you have a component renderer and it renders multiple nodes we have
to deal with them,
The fault clearly is at the javascript side, on our javascript side here.

The obvious solution would be to have insert the replace + add the sibling nodes, but this
does not work out entirely. Running recursively over all nodes also can fail in some cases
(if the subnodes
are not existing yet)

I am not sure how to resolve this in a proper and clean manner yet.. I have some testing to
do, give me a few days for a proper fix.

The workaround for now is, to always use a root element on the code side where you have your
main element and your decorations in, I probably have to work with that construct as well,
for the dom manipulation to have a clean handling of this case (For now this seems the only
viable option to me to handle this properly)



      was (Author: werpu):
    Ok this is a rather rare usecase, but having slept over it it can happen on component
level.

Ok lets sum this up, if you have a component renderer and it renders multiple nodes we have
to deal with them,
The fault clearly is at the javascript side, on our javascript side here.

The obvious solution would be to have insert the replace + add the sibling nodes, but this
does not work out entirely. Running recursively over all nodes also can fail in some cases
(if the subnodes
are not existing yet)

I am not sure how to resolve this in a proper and clean manner yet.. I have some testing to
do, give me a few days for a proper fix.

The workaround for now is, to always use a root element on the code side where you have your
main element and your decorations in, I probably have to work with that construct as well,
for the dom manipulation to have a clean handling of this case (For now this seems the only
viable option to me to handle this properly)


  
> (JSF.js) Ajax Render component problem, replace with whole fragment not one element.
> ------------------------------------------------------------------------------------
>
>                 Key: MYFACES-2640
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2640
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.0.0-beta-3
>         Environment: tomcat 6.0.20 java (mac os x )
>            Reporter: Mark Li
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> after ajax submit, jsf.js will re-render some element depending on jsf.ajax.request({render:"
some elements "});
> but this js code will cause some problem.
> jsf.js:
> myfaces._impl._util._Utils.replaceHtmlItem = function (request, context, itemIdToReplace,
newTag, form) {
> ......
>                     var fragment = range.createContextualFragment(newTag);
>                     evalNode = item.parentNode.replaceChild(fragment, item)
> .....
> }
> sometime fragment will has more than one childNodes, or the childNode not has clientId,
but the childNode of childNode has clientId.
> this will cause html unstable.
> Please fix it.
> this is my suggestion:
> myfaces._impl._util._Utils.replaceHtmlItem = function (request, context, itemIdToReplace,
newTag, form) {
>            .............
>               Orginal:
>                     var fragment = range.createContextualFragment(newTag);
>                     evalNode = item.parentNode.replaceChild(fragment, item)
>               fix:
>                     var fragment = range.createContextualFragment(newTag);
>                     var replaceItem = myfaces._impl._util._Utils.findHtmlItemFromFragment(fragment,
itemIdToReplace);
>                     if(replaceItem == null)replaceItem = fragment;
>                     evalNode = item.parentNode.replaceChild(replaceItem, item)
>        ..................
> }
>     myfaces._impl._util._Utils.findHtmlItemFromFragment = function(fragment, itemId){
>     	if(fragment.childNodes == null)
>     		return null;
>     	for(var i = 0; i < fragment.childNodes.length ; i++ ){
>     		var c = fragment.childNodes[i];
>     		if(c.id == itemId)
>     			return c;
>     	}
>     	for(var i = 0; i < fragment.childNodes.length ; i++ ){
>     		var c = fragment.childNodes[i];
>     		var item = myfaces._impl._util._Utils.findHtmlItemFromFragment(c, itemId);
>     		if(item != null)
>     			return item;
>     	}
>     	return null;
>     };

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message