[jsr-314-open-mirror] [jsr-314-open] question regarding ajax update cycle
Cagatay Civici
cagatay.civici at gmail.com
Wed Apr 7 06:52:35 EDT 2010
Hi,
I agree with Ganesh and Alexander.
All components in PrimeFaces have an enclosing container element (span or div) with a proper client id assigned as well.
Regards,
Cagatay
On Apr 7, 2010, at 11:28 AM, Ganesh wrote:
> Hi,
>
> I agree with Alexander. The component you posted is not well designed. As Alexander pointed out: What would getClientId() return for this component? I also agree with Alexanders solution: enclose the components reposne with a div that carries a proper clientId.
>
> It's an obvious characteristic of JSF AJAX to require having one HMTL element corresponding with one JSF component to be able to replace it via AJAX. Trying to craft a sophisticated solution for the cornercase of a badly designed component leads to a highly complicated specification enhancement that only makes sense to very few experts.
>
> Best regards,
> Ganesh
>
> Martin Marinschek schrieb:
>> Hi Werner,
>> no. Don't follow any broken approach - emit an error saying that this
>> is not possible. Then the component author will know. Mojarra should
>> do the same.
>> I agree that the API should be more open than. Can we expose this API
>> unilaterally at least in MyFaces?
>> best regards,
>> Martin
>> On 4/7/10, Werner Punz <werner.punz at gmail.com> wrote:
>>> The problem here is either behavior is wrong (not sure which is wronger), in
>>> the end the only real fix is to expose the full partialresponse writer API
>>> to the component author to give him full access on how his subpart on the
>>> page gets updated.
>>>
>>> This road currently is blocked simply by enforcing an open update tag on the
>>> components from the rendering lifecycle!
>>>
>>> The workaround is to make the component authors aware that for the PPR case
>>> within a component they always should make a root node which has the
>>> identifier of ClientId and embed their own rendering into this root node
>>> (div, span, whatever)
>>>
>>> So if I follow a broken approach I personally prefer to use the one which is
>>> consistent over all two implementations.
>>>
>>> In the end the only fix I know which makes sense to this problem is to add a
>>> marker interface to the spec
>>> something like PPRAware and a separate component renderer method, renderPPR
>>> and then adding placeholders for the component while the update tag is open,
>>> defer the rendering of the PPRAware component to the stage when update is
>>> closed
>>> and then render those deferred components by giving them control over the
>>> update, insert etc... possibilities wie theoretically have in the API and
>>> practically can only use outside of the render cycle :-(
>>>
>>>
>>>
>>>
>>> On Wed, Apr 7, 2010 at 9:26 AM, Martin Marinschek
>>> <mmarinschek at apache.org>wrote:
>>>
>>>> Hi guys,
>>>>
>>>> is it really useful to follow Mojarra's behaviour here? I think it
>>>> might be a little better to have a wandering div (and see that
>>>> something is wrong) than just ignoring the second div and with this
>>>> let the developer in the believe that everything is alright, which it
>>>> really isn't.
>>>>
>>>> best regards,
>>>>
>>>> Martin
>>>>
>>>> On 4/7/10, Werner Punz <werner.punz at gmail.com> wrote:
>>>>> Yes that is what I was basically posting as workaround to the issue I
>>>> got,
>>>>> nevertheless I now coded Mojarras behavior into MyFaces, just to be
>>>>> consistent here.
>>>>> (With the exception that I also fixed it on the IE side as Mojarra
>>>> behaves
>>>>> for
>>>>> more compliant browsers to have the same behavior over all browsers)
>>>>>
>>>>> I do not expect any component author really doing it differently than
>>>>> you
>>>>> said, Alex, but in the end to really resolve the problem we probably
>>>>> have
>>>> to
>>>>> resolve the enforced update issue in the long run so that the
>>>>> PartialResponseWriter API can be used in its full extent and glory by
>>>>> the
>>>>> component authors instead of being shoehorned into an already open
>>>>> update
>>>>> tag!
>>>>>
>>>>> Werner
>>>>>
>>>>>
>>>>> On Wed, Apr 7, 2010 at 12:05 AM, Alexander Smirnov
>>>>> <asmirnov at exadel.com>wrote:
>>>>>
>>>>>> You have to keep in mind that JSF Ajax updates component content, not
>>>>>> the Html elements. Therefore, any component have to has enclosing Html
>>>>>> element ( <div> , <span> whatever else ) with id attribute generated as
>>>>>> the component clientId to be compatible with Ajax. In your case, you
>>>>>> have to create placeholder element ( probably <div> ) that encapsulates
>>>>>> both of your elements.
>>>>>>
>>>>>> On 04/06/2010 09:42 AM, Werner Punz wrote:
>>>>>>> Hello everyone, I ran into an issue regarding the update, which is
>>>>>>> closely related to a behavior jsf2 exposes regarding component
>>>> rendering
>>>>>>> in the update cycle.
>>>>>>>
>>>>>>> The main issue is following: If we have a component which we trigger
>>>>>>> with following code:
>>>>>>>
>>>>>>> <myComp:javascriptTestComponent
>>>>>>> id="myTestComponent"></grv:javascriptTestComponent>
>>>>>>> <a href="#" name="mego3"
>>>>>>>
>>>>>>> onclick="jsf.ajax.request(this,event,{execute:'myTestComponent',
>>>>>>> render:'myTestComponent'}); return false;">submit
>>>>>>> me</a>
>>>>>>>
>>>>>>> and the component itself renders following in its renderer:
>>>>>>>
>>>>>>> ResponseWriter writer = context.getResponseWriter();
>>>>>>> writer.startElement(DIV, component);
>>>>>>> writer.writeAttribute(ID,component.getClientId(context), null
>>>> );
>>>>>>> writer.write("hello world"+Math.random());
>>>>>>> writer.endElement(DIV);
>>>>>>>
>>>>>>> writer = context.getResponseWriter();
>>>>>>> writer.startElement(DIV, component);
>>>>>>>
>>>>>>> writer.writeAttribute(ID,component.getClientId(context)+":_second",
>>>> null
>>>>>> );
>>>>>>> writer.write("hello world"+Math.random());
>>>>>>> writer.endElement(DIV);
>>>>>>>
>>>>>>>
>>>>>>> the resulting ppr response now looks like following:
>>>>>>>
>>>>>>> |<update id="myTestComponent">
>>>>>>>
>>>>>>> <![CDATA||[<div id="myTestComponent">hello
>>>> world0.8619488403376933</div>
>>>>>>> <div id="myTestComponent:_second">hello||
>>>>>> world0.25176272071402683</div>]]>
>>>>>>> </update>...|
>>>>>>>
>>>>>>> Now the problem is, since the update part of the response is already
>>>>>>> opened the component author cannot really influence the response
>>>>>>> rendering in any meaningful way (the correct solution would be to
>>>> issue
>>>>>>> two update commands here)
>>>>>>> Now the javascript has to react on the client side to resolve that
>>>>>>> situation.
>>>>>>>
>>>>>>> Now MyFaces just replaced the original
>>>>>>>
>>>>>>> |myTestComponent|
>>>>>>>
>>>>>>> with the update code and hence the result was a div wandering down
>>>> (aka
>>>>>>> wrong update)
>>>>>>>
>>>>>>> hello world0.48748236239247755
>>>>>>> hello world0.6020541783857698
>>>>>>> hello world0.7181842402648805
>>>>>>> hello world0.2803064696069696
>>>>>>> (after a handful of requests, with the lowest line being the first
>>>>>>> second div being dran)
>>>>>>>
>>>>>>> now due to being incorrect a user gave me rightfully a bug issue. I
>>>> dug
>>>>>>> deeper and ran the same example
>>>>>>> against Mojarra, now Mojarra does cherry pick the delivered first div
>>>>>>> and replaces the original div, and omits the second one.
>>>>>>> The Problem is Mojarra just does it for newer browsers, it does the
>>>> same
>>>>>>> just updating the original element with the replacement code
>>>>>>> (and hence producing a wandering div) for IE6+7-
>>>>>>>
>>>>>>> My question is, first, how to handle that problem correctly.
>>>>>>> Secondly,
>>>>>>> is this even a problem for us or more one for the component author?
>>>>>>> In the end the main problem would not exist if they ajax api could be
>>>>>>> used on the component side properly without being enforced already
>>>> into
>>>>>>> an update (or to allow nested updates, inserts within an update)
>>>>>>>
>>>>>>>
>>>>>>> Werner
>>>>>>>
>>>>
>>>> --
>>>>
>>>> http://www.irian.at
>>>>
>>>> Your JSF powerhouse -
>>>> JSF Consulting, Development and
>>>> Courses in English and German
>>>>
>>>> Professional Support for Apache MyFaces
>>>>
>
> --
> "There are two kinds of people in the world, those who believe there are two kinds of people and those who don't."
> — Robert Benchley
More information about the jsr-314-open-mirror
mailing list