A better example would be where the client-side objects have considerable 
state, eg. a Graph object or, more complex still, a Graph editor. 

Of course, client-side objects may be avoided having your javascript 
save/retrieve all state to/from hidden fields in the relevant part of the DOM, 
but that's just another implementation choice.

On 14 Nov 2014, at 10:00 am, Geoff Callender 
<geoff.callender.jumpst...@gmail.com> wrote:

> Yep, that's a valid case, and it's one I have to put into JumpStart.
> 
> Here's the way I handle it. I'd like to see what others do.
> 
> Have the module keep an array of objects, identified by a key. The 
> server-side can provide the key when initialising and later whenever invoking 
> a function. The component can use any value for the key as long as it is 
> unique on the page and as long as it is repeatable (eg. the component might 
> need to derive the key from its container or context). 
> 
> Here's an example snippet from a module I called "activate-selectables". More 
> than one component on my page uses this module. A typical case is when I have 
> a list of items on the page, and a button that pops up a modal with another 
> list of items. When an item is selected, the server-side has to set the 
> currentElement on the correct list.
> 
> define([ "jquery", "t5/core/console" ], function($, console) {
> 
>       var selectablesContainers = [];
> 
>       SelectablesContainer = function() {
> 
>               init = function(params) {
>                       containerId = params.containerId;
>                       selectableClass = params.selectableCssClass;
>                       selectedClass = params.selectedCssClass;
>                       // etc
>                       var $container = $('#' + containerId);
>                       $container.on('click', '.' + selectableClass, 
> doSelected);
>               };
> 
>               doSelected = function() {
>                       var $clicked = $(this);
>                       $clicked.addClass(selectedClass);
>                       $clicked.trigger('selected');
>               };
> 
>               setCurrentElement = function(selectableName) {
>                       // etc.
>               };
> 
>               return {
>                       init : init,
>                       setCurrentElement : setCurrentElement
>               };
>       };
> 
>       init = function(key, params) {
>               var selectablesContainer = new SelectablesContainer();
>               selectablesContainer.init(params);
>               selectablesContainers[key] = selectablesContainer;
>       };
> 
>       setCurrentElement = function(key, currentElementName) {
>               var selectablesContainer = selectablesContainers[key];
>               selectablesContainer.setCurrentElement(currentElementName);
>       };
> 
>       return {
>               init : init,
>               setCurrentElement : setCurrentElement
>       };
> 
> });
> 
> And some corresponding java:
> 
>       void afterRender() {
>               JSONObject params = new JSONObject();
>               params.put("containerId", thingsDiv.getClientId());
>               //etc
>               
> javaScriptSupport.require("activate-selectables").invoke("init").with(SELECTABLES_KEY,
>  params);
>       }
> 
>       Object onThingSelected(Integer thingId) {
>               this.thingId = thingId;
>               // etc
>               
> ajaxResponseRenderer.addCallback(makeScriptToSetCurrentElement(selectableName));
>               // etc
>       }
> 
>       private JavaScriptCallback makeScriptToSetCurrentElement(final String 
> selectableName) {
> 
>               return new JavaScriptCallback() {
> 
>                       public void run(JavaScriptSupport javaScriptSupport) {
>                               
> javaScriptSupport.require("activate-selectables").invoke("setCurrentElement")
>                                               .with(SELECTABLES_KEY, 
> selectableName);
>                       }
> 
>               };
> 
>       }
> 
> In this case I get away with SELECTABLES_KEY being a constant but, as I said 
> above, sometimes you have to derive its value from its container or event 
> context.
> 
> Geoff
> 
> On 14 Nov 2014, at 9:18 am, Paul Stanton <pa...@mapshed.com.au> wrote:
> 
>> Oh,
>> 
>> so calling
>> require("modal").invoke("activate")
>> 
>> and then later
>> require("modal").invoke("deactivate")
>> 
>> .. both re-construct a seperate "modal" js object and then call one of the 
>> two published functions...
>> 
>> what if you have two different modals? what if they are init-ed differently:
>> 
>> java:afterRender() {
>>    require("modal").invoke("init").with("message 1");
>>    require("modal").invoke("init").with("message 2");
>> }
>> 
>> and then later
>> java:onSomeEvent() {
>>    require("modal").invoke("activate");
>> }
>> 
>> this flow would essentially construct the modal module instance 3 times, and 
>> the "activate" wouldn't know about "message 1" or "message 2".
>> 
>> Therefore, how would I re-aquire a handle to a specific module instance 
>> later on? for eg:
>> 
>> java:onSomeEvent(){
>>    // activate modal with "message 1"
>>    require("modal").invoke("activate");
>> }
>> 
>> I know this example doesn't make much practical sense, but the concept of 
>> communicating with something stateful is pretty key!
>> 
>> p.
>> 
>> On 13/11/2014 4:34 PM, Geoff Callender wrote:
>>> Have you had a look at these two:
>>> 
>>>     
>>> http://jumpstart.doublenegative.com.au/jumpstart7/examples/javascript/modal/1
>>>     
>>> http://jumpstart.doublenegative.com.au/jumpstart7/examples/javascript/reusablemodal/1
>>> 
>>> Do they fit your scenario?
>>> 
>>> On 13 Nov 2014, at 3:40 pm, Paul Stanton <pa...@mapshed.com.au> wrote:
>>> 
>>>> Hi Geoff,
>>>> 
>>>> I have found your examples invaluable in learning some of the basics of 
>>>> this (and other) concepts. I can't thank you enough
>>>> 
>>>> .. the only thing I can see is missing currently is the example I asked 
>>>> about in the previous mail:
>>>> 
>>>> Basically, how do I interact with a js module instance after it is created?
>>>> 
>>>> pretend some server-side state changes between afterRender and 
>>>> onSomeEvent, and the client needs to react accordingly.
>>>> 
>>>> jss.addScript is deprecated, so I "shouldn't" be telling the client to 
>>>> execute script apparently...
>>>> 
>>>> cheers, p.
>>>> 
>>>> On 13/11/2014 2:36 PM, Geoff Callender wrote:
>>>>> do these examples cover the situations you are describing?
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>>>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>>> 
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>> For additional commands, e-mail: users-h...@tapestry.apache.org
>> 
> 

Reply via email to