[Glass] Problem assigning to temp vars from Seaside callbacks?
Johan Brichau
johan at yesplan.be
Tue Jan 28 00:36:11 PST 2014
Hey Mariano,
If you want to transfer values between callbacks (closures) in Seaside on Gemstone, you need to put the value in a valueholder object instead of assigning to method temporaries. Otherwise, you experience exactly what you see. That means, for example:
| valueholder|
valueholder := ValueHolder new.
html jQuery ajax
callback: [:v | valueholder value: v];
script: [:s | self doSomethingWith: valueholder value]
You can use anything you like as a valueholder: Association, Array, Set, ... whatever. As long as you are not directly assigning to the temporary var.
There is also code demonstrating this in the JQueryUI Autocomplete code of Seaside (gemstone version) [2].
I referred to that issue in this mail [1] but it was a bit condensed I guess.
cheers
Johan
[1] http://forum.world.st/Glass-Basic-questions-regarding-GemBuilder-for-Smalltalk-GemTools-and-tODE-tp4711463p4711987.html
[2] https://github.com/glassdb/Seaside31/blob/gemstone3.1/repository/JQuery-UI.package/JQAutocomplete.class/instance/search.labels.callback..st
On 27 Jan 2014, at 22:10, Mariano Martinez Peck <marianopeck at gmail.com> wrote:
> Hi guys,
>
> I am starting to see strange problems that happen only in GemStone but work correctly in Pharo.
>
> I have a menu action that looks like this:
>
>
> (aWebAppBrowser actionType new
> context: #contextMenu;
> argumentTypes:
> {Object.
> Collection.
> (aWebAppBrowser class)};
> label: 'SIXX Import and Replace DB';
> block: [ :cls :collection :app |
> | list |
> (app activeModelReport isKindOf: MAReport)
> ifTrue: [ | filenameForm filename |
> list := app objectsForActions. "filtered and sorted"
> filenameForm := MyRenderedBlockFormDialog new.
> filenameForm
> buttonsAndCallbacksList:
> {(#import -> [ filenameForm answer: true ]).
> (#cancel -> [ filenameForm answer: false ])};
> renderingBlock: [ :html |
> html text: 'Import filename prefix'.
> html textInput
> size: 100;
> callback: [ :value | self halt. filename := value trimBoth ];
> value: 'filename_here' ];
> addForm.
> (app call: filenameForm)
> ifTrue: [
> self halt.
>
> ]
> ]]
>
>
> That action has the closure which is compiled once at the beginning of the app and then valued whenever clicked. Now...that closure creates an instance of MyRenderedBlockFormDialog which has a simple input for a filename. When I click on "import" the callback of the text input is invoked correctly. Soo....'filename' temp receives the value correctly. However, after the call to such a component (app call: filenameForm), (the "self halt" inside the ifTrue)... the temp var 'filename' has a nil!!!! Any ideas why I get a nil here instead of the real value?
> Same code and same test in Pharo does work correctly.
>
> Thanks in advance,
>
> --
> Mariano
> http://marianopeck.wordpress.com
> _______________________________________________
> Glass mailing list
> Glass at lists.gemtalksystems.com
> http://lists.gemtalksystems.com/mailman/listinfo/glass
More information about the Glass
mailing list