[Seaside] Rendering Callbacks during an Ajax callback

jtuchel at objektfabrik.de jtuchel at objektfabrik.de
Sat Feb 11 08:39:01 UTC 2017


Unfortunately, this one-argument block idea doesn't work. If I register 
the Ajax callback with an argument, the callback method will receive nil 
as parameter....



Am 11.02.17 um 09:32 schrieb jtuchel at objektfabrik.de:
> 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 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
> 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/dc8db416/attachment-0001.html>


More information about the seaside mailing list