[Seaside] Rendering Callbacks during an Ajax callback

jtuchel at objektfabrik.de jtuchel at objektfabrik.de
Sat Feb 11 08:32:50 UTC 2017


Hi Johan,

first of all: thanks for your time!


 > I’m a bit confused why you are rendering in this way in your callback 
method.

Maybe the answer wouldn't really be something I'd like to hear ;-)


The method doesn't have a parameter, because the ajax call is initiated 
by hand-written javascript code. One reason is that the list can be very 
long (up to 2000 list items) and I only want to install one click 
handler on the document using

$(document).on("click",".mylistItemClass", function() { ... $.ajax() 
...}).done();

etc. etc.

So I register only one callback in updateRoot: and store the number in 
an instVar

updateRoot:
     checkboxenCallback := html context callbacks store: (JSAjaxCallback on: [self einOderAusblendenCheckbox]).


then, in renderContentOn; I do:


renderContentOn:
	html document addLoadScript: (
         '$(document).on("change", ".ein-aus", function(evt) {
                     evt.preventDefault();
	            var target = $(evt.target);
                     var row = target.parents(".row");

                     $.ajax({
                         url:  %1+"&pk="+ rahmenId ,
                         })

                         .fail(function(res) {alert(res.responseText)})

                         .done(function(result) {

                                         row.replaceWith(result); }});

                 })'

             bindWith: (html actionUrl copy addField: checkboxenCallback) asString sstAsQuotedString)



So I guess you are asking the right question: why do I build up a new 
context/builder... ? I never tried, but maybe I should just register a 
one argument-block as callback and hope for some Seaside magic?

I will try that immediately (just occured to me while typing this 
message...)


Joachim







Am 11.02.17 um 09:11 schrieb Johan Brichau:
> Hi Joachim,
>
> I’m a bit confused why you are rendering in this way in your callback 
> method.
> Why are you doing this differently than in any other Seaside rendering 
> method?
>
> Since you are instantiating a new builder, it is going to create it’s 
> own rendercontext, hence it’s own registry for callbacks.
> I have not deeply investigated the result of your code snippet, but 
> this seems to me why you are seeing that callback numbers are restarted.
>
> Now, if you re-render list-item with a callback on it, Seaside will 
> indeed need to register a new callback. The memory overhead should be 
> limited to the registry dictionary entry and a WASeasideCallback 
> instance, however, since the block and it’s lexical context object 
> will already exist before rendering. So… I would not worry about 
> memory overhead.
>
> If you are doing this because you are doing hand-written ajax calls: 
> what I tend to do is generate a jQuery-Seaside ajax callback and 
> assign this to a Javascript variable, which I can use from the 
> hand-written JS. Of course, there’s variations on this other than 
> global-variable assignment but that’s all Javascript fiddling.
>
> So, before I try to dig deeper in your problem: why is this method not 
> called: "changeSomeStuffOnTheServerAndRedrawOn: html” :) ?
>
> Johan
>
>
>> On 10 Feb 2017, at 17:26, jtuchel at objektfabrik.de 
>> <mailto:jtuchel at objektfabrik.de> wrote:
>>
>> Dear Seasiders,
>>
>> I must bee overlooking something obvious.
>>
>> I want to redraw a listItem in and unorderedList (it is a boostrap 
>> .list-item .row, but that doesn't really matter) in an Ajax callback.
>> This listItem contains normal anchors with callbacks.
>>
>> The ajax call is initiated in a javascript function, not rendered by 
>> Seaside. This call to ajax does the following;
>>
>>
>> $.ajax( ... ).done(function(result) {
>>         row.replaceWith(result);});
>>
>>
>> where row is a jquery that contains the listItem. The rerendering 
>> works very well and all seems good.
>>
>> Except for one little detail: the callbacks rendered in the AJax 
>> callback are re-numbered from 1 and once you click on oneof the 
>> re-rendered link it is a nice surprise what method might get called 
>> on the server. I guess I am messing with the _s and _k parameters in 
>> my caööback method.
>>
>> So here is my callback method which answers the re-rendered listItem/row:
>>
>>
>> changeSomeStuffOnTheServerAndRedraw    | rahmenElementId fields req betrag planElement conv wrapper ctx 
>> contKey row resp |        ctx := self requestContext.        req := 
>> ctx request.        resp := ctx response.        fields := req 
>> fields.        "Some boring business stuff which works like a charm, 
>> including finding the right business objects, changing them, commits 
>> in Glorp and whatnot"
>>         "Re-render the row"
>>         row := self findTheListItemComponentForRerendering.        
>> resp            status: 200;            contentType: (WAMimeType 
>> textHtml charset: ctx handler charSet);            nextPutAll: (    
>>             (self rendererClass builder)"**->"              
>> actionUrl: (ctx session actionUrlForKey: contKey);   "I also tried 
>> leaving this out --> even worse"                    fullDocument: 
>> false;                    render: [:html |                        
>> html render: row ])
>> I think the problem is either the fact that I shouldn't be using the 
>> requestContext of the Ajax callback, or the actionUrl: part is wrong.
>> The rows not re-rendered still work like a charm.
>>
>>
>> You can see in the attached picture that both a not-re-rendered row 
>> and the re-rendered row point to the same 's anchors point to the 
>> same url with identical _s and _k parameters, but thesecond one is 
>> the re-rendered and its callback number is 1 instead of 51, which it 
>> had before re-rendering:
>>
>> <ifioakbcdojcdbmm.png>
>>
>> If I use the URL and replace the 1 with 51, The correct callback is 
>> being called, the initial callback is still registered.
>> I wouldn't mind if the re-render registered another Callback, even if 
>> that means I waste memory, but it seems I am registering the new 
>> callbacks in some registry that's new for the ajax callback.... (I am 
>> confused)
>>
>> Any hints? Ideas? How can I make sure the anchors in that redrawn 
>> listItem find their callback blocks on the server?
>>
>>
>> Thank you in advance
>>
>> Joachim
>>
>>
>>
>>
>> -- 
>> -----------------------------------------------------------------------
>> Objektfabrik Joachim Tuchelmailto:jtuchel at objektfabrik.de
>> Fliederweg 1http://www.objektfabrik.de
>> D-71640 Ludwigsburghttp://joachimtuchel.wordpress.com
>> Telefon: +49 7141 56 10 86 0         Fax: +49 7141 56 10 86 1
>>
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org 
>> <mailto:seaside at lists.squeakfoundation.org>
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
>
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside


-- 
-----------------------------------------------------------------------
Objektfabrik Joachim Tuchel          mailto:jtuchel at objektfabrik.de
Fliederweg 1                         http://www.objektfabrik.de
D-71640 Ludwigsburg                  http://joachimtuchel.wordpress.com
Telefon: +49 7141 56 10 86 0         Fax: +49 7141 56 10 86 1

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/seaside/attachments/20170211/5939619e/attachment.html>


More information about the seaside mailing list