[richfaces-issues] [JBoss JIRA] Updated: (RF-11364) <a4j:region> and the "process" attribute

Nicholas Oxhøj (JIRA) jira-events at lists.jboss.org
Tue Aug 30 03:50:26 EDT 2011


     [ https://issues.jboss.org/browse/RF-11364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nicholas Oxhøj updated RF-11364:
--------------------------------

        Description: 
Hi,

It seems to me that the <a4j:region> doesn't work correctly together with the process="..." attribute on AJAX commands. Specifically you cannot process inputs outside the <a4j:region> even though you list them specifically in the process attribute.

I have always thought that ajaxSingle and <a4j:region> were two functionally equivalent ways of specifying which inputs should be processed in the first phases of the JSF lifecycle - one is easy to use if you only want to process a single input and the other if you have a group of related inputs.

In chapter [5.7.4. "Decide what to process"|http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#process] of the Richfaces 3.3.X documentation, it is stated that: The "_process_" attribute allows to define the ids of components to be processed together with the component which is marked as ajaxSingle *+or wrapped to region+*.

As I understand this, the example in the documentation:

{code:xml}
<h:inputText value="#{bean.name}" id="name">
    <a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
</h:inputText>
<h:inputTextarea value="#{bean.description}" id="desc" />
<h:inputText value="#{bean.email}" id="email">
    <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
</h:inputText>
{code}

should be functionally equivalent to the following code:

{code:xml}
<a4j:region>
    <h:inputText value="#{bean.name}" id="name">
        <a4j:support process="email" event="onblur" reRender="someOut"/>
   </h:inputText>
</a4j:region>
<h:inputTextarea value="#{bean.description}" id="desc" />
<h:inputText value="#{bean.email}" id="email">
   <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
/h:inputText>
{code}

But this doesn't work as expected. The "email" component is no longer processed when focus leaves the "name" component.

The reason for this is found in the class UIAjaxRegion, where all the "processing methods" (processDecodes, processValidators, and processUpdates) contains code similar to the following:

{code}
if (ajaxContext.isAjaxRequest() && null != ajaxSingleClientId) {
    invokeOnComponent(context, ajaxSingleClientId, new ContextCallbackWrapper(updateCallback));
    Set<String> areasToProcess = ajaxContext.getAjaxAreasToProcess();
    if(null != areasToProcess){
        for (String areaId : areasToProcess) {
            invokeOnComponent(context, areaId, new ContextCallbackWrapper(updateCallback));
        }
    }
} else {
    super.processUpdates(context);
}
{code}

So the value of the process attribute (retrieved through ajaxContext.getAjaxAreasToProcess), is only used if the AJAX command has ajaxSingle="true". I don't understand why the "process" attribute isn't used, regardless of the value of the ajaxSingle attribute???

Looking at the code, I thought that a workaround would the be to just add ajaxSingle="true" to the <a4j:support> so that it would again look like:

{code:xml}
<a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
{code}

But this doesn't work either. Although the code above _will_ now enter the first branch and therefore loop through the areaIds specified in the process attribute, it will only find them if they are located inside the <a4j:region> itself, since the invokeOnComponent() is implicitely called on the  UIAjaxRegion.

Regards,

Nicholas Oxhøj

  was:
Hi,

It seems to me that the <a4j:region> doesn't work correctly together withe the process="..." attribute on AJAX commands. Specifically you cannot process inputs outside the <a4j:region> even though you list them specifically in the process attribute.

I have always thought that ajaxSingle and <a4j:region> were two functionally equivalent ways of specifying which inputs should be processed in the first phases of the JSF lifecycle - one is easy to use if you only want to process a single input and the other if you have a group of related inputs.

In chapter [5.7.4. "Decide what to process"|http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#process] of the Richfaces 3.3.X documentation, it is stated that: The "_process_" attribute allows to define the ids of components to be processed together with the component which is marked as ajaxSingle *+or wrapped to region+*.

As I understand this, the example in the documentation:

{code:xml}
<h:inputText value="#{bean.name}" id="name">
    <a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
</h:inputText>
<h:inputTextarea value="#{bean.description}" id="desc" />
<h:inputText value="#{bean.email}" id="email">
    <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
</h:inputText>
{code}

should be functionally equivalent to the following code:

{code:xml}
<a4j:region>
    <h:inputText value="#{bean.name}" id="name">
        <a4j:support process="email" event="onblur" reRender="someOut"/>
   </h:inputText>
</a4j:region>
<h:inputTextarea value="#{bean.description}" id="desc" />
<h:inputText value="#{bean.email}" id="email">
   <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
/h:inputText>
{code}

But this doesn't work as expected. The "email" component is no longer processed when focus leaves the "name" component.

The reason for this is found in the class UIAjaxRegion, where all the "processing methods" (processDecodes, processValidators, and processUpdates) contains code similar to the following:

{code}
if (ajaxContext.isAjaxRequest() && null != ajaxSingleClientId) {
    invokeOnComponent(context, ajaxSingleClientId, new ContextCallbackWrapper(updateCallback));
    Set<String> areasToProcess = ajaxContext.getAjaxAreasToProcess();
    if(null != areasToProcess){
        for (String areaId : areasToProcess) {
            invokeOnComponent(context, areaId, new ContextCallbackWrapper(updateCallback));
        }
    }
} else {
    super.processUpdates(context);
}
{code}

So the value of the process attribute (retrieved through ajaxContext.getAjaxAreasToProcess), is only used if the AJAX command has ajaxSingle="true". I don't understand why the "process" attribute isn't used, regardless of the value of the ajaxSingle attribute???

Looking at the code, I thought that a workaround would the be to just add ajaxSingle="true" to the <a4j:support> so that it would again look like:

{code:xml}
<a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
{code}

But this doesn't work either. Although the code above _will_ now enter the first branch and therefore loop through the areaIds specified in the process attribute, it will only find them if they are located inside the <a4j:region> itself, since the invokeOnComponent() is implicitely called on the  UIAjaxRegion.

Regards,

Nicholas Oxhøj

    Forum Reference: http://community.jboss.org/thread/171454, http://community.jboss.org/message/561884  (was: http://community.jboss.org/thread/171454, http://community.jboss.org/message/561884)


> <a4j:region> and the "process" attribute
> ----------------------------------------
>
>                 Key: RF-11364
>                 URL: https://issues.jboss.org/browse/RF-11364
>             Project: RichFaces
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 3.3.3.Final
>            Reporter: Nicholas Oxhøj
>
> Hi,
> It seems to me that the <a4j:region> doesn't work correctly together with the process="..." attribute on AJAX commands. Specifically you cannot process inputs outside the <a4j:region> even though you list them specifically in the process attribute.
> I have always thought that ajaxSingle and <a4j:region> were two functionally equivalent ways of specifying which inputs should be processed in the first phases of the JSF lifecycle - one is easy to use if you only want to process a single input and the other if you have a group of related inputs.
> In chapter [5.7.4. "Decide what to process"|http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#process] of the Richfaces 3.3.X documentation, it is stated that: The "_process_" attribute allows to define the ids of components to be processed together with the component which is marked as ajaxSingle *+or wrapped to region+*.
> As I understand this, the example in the documentation:
> {code:xml}
> <h:inputText value="#{bean.name}" id="name">
>     <a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
> </h:inputText>
> <h:inputTextarea value="#{bean.description}" id="desc" />
> <h:inputText value="#{bean.email}" id="email">
>     <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
> </h:inputText>
> {code}
> should be functionally equivalent to the following code:
> {code:xml}
> <a4j:region>
>     <h:inputText value="#{bean.name}" id="name">
>         <a4j:support process="email" event="onblur" reRender="someOut"/>
>    </h:inputText>
> </a4j:region>
> <h:inputTextarea value="#{bean.description}" id="desc" />
> <h:inputText value="#{bean.email}" id="email">
>    <a4j:support ajaxSingle="true" process="name" event="onblur" reRender="someOut"/>
> /h:inputText>
> {code}
> But this doesn't work as expected. The "email" component is no longer processed when focus leaves the "name" component.
> The reason for this is found in the class UIAjaxRegion, where all the "processing methods" (processDecodes, processValidators, and processUpdates) contains code similar to the following:
> {code}
> if (ajaxContext.isAjaxRequest() && null != ajaxSingleClientId) {
>     invokeOnComponent(context, ajaxSingleClientId, new ContextCallbackWrapper(updateCallback));
>     Set<String> areasToProcess = ajaxContext.getAjaxAreasToProcess();
>     if(null != areasToProcess){
>         for (String areaId : areasToProcess) {
>             invokeOnComponent(context, areaId, new ContextCallbackWrapper(updateCallback));
>         }
>     }
> } else {
>     super.processUpdates(context);
> }
> {code}
> So the value of the process attribute (retrieved through ajaxContext.getAjaxAreasToProcess), is only used if the AJAX command has ajaxSingle="true". I don't understand why the "process" attribute isn't used, regardless of the value of the ajaxSingle attribute???
> Looking at the code, I thought that a workaround would the be to just add ajaxSingle="true" to the <a4j:support> so that it would again look like:
> {code:xml}
> <a4j:support ajaxSingle="true" process="email" event="onblur" reRender="someOut"/>
> {code}
> But this doesn't work either. Although the code above _will_ now enter the first branch and therefore loop through the areaIds specified in the process attribute, it will only find them if they are located inside the <a4j:region> itself, since the invokeOnComponent() is implicitely called on the  UIAjaxRegion.
> Regards,
> Nicholas Oxhøj

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the richfaces-issues mailing list