Hi,

Andy has logged a spec issue on this. He thinks absolute ids should be prepended by a colon and wants to add this to the spec:

https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=567

We can comment the issue there.

Best regards,
Ganesh

Alexander Bell schrieb:
I thought we don't have to use the leading colon. If JSF cannot find "outsideImage" it has to search the component in the next higher naming container (so f:view). I would use the leading colon when I've got the same ID for two components in tow different naming containers. In this situation the ID's are different so it makes it much more complicated with the leading colon. IMO, if the ID is unique on the page the "single" ID (without the leading colon) in the render attribute would be appropriate otherwise an exception is thrown (and then you have to use the leading colon).



2009/5/25 Ganesh <[email protected] <mailto:[email protected]>>

    Hi,

    We'll have to include this with the logic of the f:ajax tag.

    Best Regards,
    Ganesh

    -------- Original-Nachricht --------
    Betreff:        Re: Ajax rendering of components among compositions?
    Datum:  Mon, 25 May 2009 08:06:08 -0400
    Von:    Andy Schwartz <[email protected]
    <mailto:[email protected]>>
    Antwort an:     JSR 314 Open Mailing list <[email protected]
    <mailto:[email protected]>>
    An:     [email protected] <mailto:[email protected]>



    Gang -

    There is one obviously critical piece of information missing here
    that clearly needs to be described more explicitly within the
    spec/pdldocs. The format for the execute/render ids in the f:ajax
    tag matches the format for ids that are passed to findComponent().
    That is... ids that do not start with the naming container
    separator character are treated as relative to the current naming
    container. Ids that do start with the separator character are
    treated as absolute ids - ie. are resolved relative to the UIViewRoot.

    So, for example, let's say we have the following component tree
    where we use f:subview to introduce a naming contianer

    <f:view>
    <f:subview id="namingContainer">
    <h:commandButton id="insideButton"/>
    <h:graphicImage id="insideImage"/>
    </f:subview>

    <h:graphicImage id="outsideImage"/>

    </f:view>

    If we want to Ajax-enable the "insideButton" to target the
    "insideImage, we would use the following f:ajax tag:

    <f:ajax render="insideImage"/>

    If, on the other hand, we want to target the "outerImage", which
    is outside of the naming container, then we must use an "absolute
    id", eg:

    <f:ajax render=":outsideImage"/>

    (Note the leading ":" character.) This is similar to calling
    insideButtonComponent.findComponent(":outsideImage") - ie. this
    will start the search for the "outsideImage" id up at the root
    naming container.

    The fact that the pdldocs do not describe the format for
    execute/render ids is clearly a spec bug that needs to be
    addressed. I will open a bug to track this in a moment. This
    behavior is defined in the actual spec document itself in section
    10.4.1.1 under the title 'Specifying “execute”/”render”
    Identifiers'. But even that section could use some clarification
    (eg. could use an example like the one above to illustrate the
    behavior).


    David Geary wrote On 5/24/2009 11:39 PM ET:

        Notice the <f:ajax> tag. I think I'm accessing the image from
        the parent component (map.xhtml) correctly. However, when I
        load the page I get this:

        <f:ajax> contains an unknown id
        
'form:j_id1186681689_16ef8569:0:j_id1186681689_16ef8513:j_id-1105909415_41ead6fe:image'


    If I had to guess (haven't looked at the implementation yet), the
    issue is that we are searching for this id relative to the
    composite component's naming container. Since this particular id
    is not present under the composite component, we do not find the
    target component. We should make this error message more explicit
    - ie. we should include the id of the naming container within
    which we searched for the id.


        If I remove the f:ajax tag, load the page, and check the
        source, I see an <img> tag:

        <img
        
id="form:j_id1186681689_16ef8569:0:j_id1186681689_16ef8513:j_id-1105909415_41ead6fe:image"
        src="..."/>

        And that id is *exactly* what <f:ajax> says it cannot find.
        It's in the page, but <f:ajax> cannot find it?!?

        My guess is that <f:ajax> is evaluating the id before the page
        is completely constructed, and therefore, it doesn't find it,
        but that's just a WAG on my part.


    You'll need to use the ":" prefix within your render id to
    indicate that you are specifying an absolute id. If that does not
    work, then my guess is that there is an implementation bug here.

    Andy





--
Mit freundlichen Grüßen / Kind regards
Alexander Bell

J4Fry OpenSource Community
Internet: http://www.j4fry.org
E-Mail: [email protected] <mailto:[email protected]>
Webprofil: http://www.j4fry.org/alexanderbell.shtml

Reply via email to