[
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.