Hi Matthias,
how do You define the myModule?
It should be a javascript file in META-INF/modules/myModule.js to be
automatically loaded as module.
alternatively You can contribute the ModuleManager in Yout AppModule
to laod desired JS file as module:
    @Contribute(ModuleManager.class)
    public static void loadExtraModules(MappedConfiguration<String,
Object> configuration,
            @Path("META-INF/assets/js/myModule.js") Resource myModule)
throws IOException {
        configuration.add("myModule", new
JavaScriptModuleConfiguration(myModule));
    }

2013/12/15 Matthias <thegreatme...@gmail.com>:
> Hi Eugen,
>
> thanks a lot, I got the zone updates now :). There is only one problem with
> the initialisation at startup.
> When I use the invoke method require js prints an error: RequireJS error:
> require: moduleLib is undefined
>
>     @AfterRender
>     public void afterRender() {
>         javaScriptSupport.require("myModule").invoke("moduleFunc");
>     }
>
> When I debug the javascript code it looks like my module is not loaded
> correctly by require js, but I have no idea why:
>
> t5/core/pageinit (line 63)
>
> return require([moduleName], function(moduleLib) {
>   // moduleLib is undefined here
> });
>
> The moduleName is "myModule", but when the function is executed the
> moduleLib is "undefined" and cannot call
> the moduleFunc function.
>
>
>
> On 12.12.2013 21:34, Eugen wrote:
>>
>> Hi Matthias,
>> as second parameter of deferredZoneUpdate() function You need to
>> provide a event link to a function that returns a block or a
>> Zone.Body, something like:
>>
>>      @OnEvent("update-zone-event")
>>      Object myEvent() {
>>         return request.isXHR()?zone.getBody():null;
>>      }
>>
>> the event Link, that should be passed to js Module can be created as
>> follow:
>>
>> public String getZoneUpdateLink() {
>>       componentResources.createEventLink("update-zone-event",
>> context).toAbsoluteURI();
>> }
>>
>> JavaScript, something like
>> require([ "jquery", "t5/core/zone" ], function($, zoneManager) {
>>      var moduleFunc, exports;
>>      moduleFunc = function(myController, myZoneId, url){
>>          $('#'+myControllerId).on("myEvent", function(e) {
>>              zoneManager.deferredZoneUpdate(myZoneId, url);
>>          }
>>      };
>>      return exports = {
>>          moduleFunc: moduleFunc
>>      };
>> });
>> }).call(this);
>>
>> and initialization call in page/component:
>>
>>
>> javaScriptSupport.require("myModule").invoke("moduleFunc").with(myControllerId,
>> zone.getClientId(), getZoneUpdateLink());
>>
>>
>> 2013/12/12 Matthias <thegreatme...@gmail.com>:
>>>
>>> Thanks to both of you, I tried Howard's approach but I think I missing
>>> something fundamental.
>>> Heres my new code:
>>>
>>> JavaScript
>>> require([ "jquery", "t5/core/zone" ], function($, zoneManager) {
>>>
>>>      // #1 with zone.update
>>>      var myZone = $("#myZone");
>>>      // why do I have to set the data-update-zone attribute?
>>>      myZone.attr("data-update-zone", "myZone");
>>>      var zone = zoneManager.findZone(myZone);
>>>      // this works, but just with a string. should I get the dom elements
>>> via
>>> ajax?
>>>      zone.update("some string");
>>>
>>>      // #2 refresh - there is no refresh method on the zone?
>>>      // zone.refresh();
>>>
>>>      // #3 defferedZoneUpdate
>>>      // the java method is called - maybe this can work
>>>      zoneManager.deferredZoneUpdate("myZone",
>>> "http://localhost:8080/search.myZone";);
>>> });
>>>
>>> Java
>>> public class Search {
>>>
>>>      // the method is called successfully, but my zone is not updated in
>>> any
>>> way.
>>>      JSONArray onActionFromDriverZone() {
>>>          JSONArray arr = new JSONArray();
>>>          JSONObject d = new JSONObject();
>>>          d.put("id", "2");
>>>          arr.put(d);
>>>          return arr;
>>>
>>>      }
>>> }
>>>
>>>
>>> On 12.12.2013 12:56, Howard Lewis Ship wrote:
>>>>
>>>> The short form is:  trigger an events.zone.update event on the zone's
>>>> client-side element to update it immediately, using available content (a
>>>> string, or DOM elements).
>>>>
>>>> Or, trigger events.zone.refresh event when you know a URL and additional
>>>> parameters; Tapestry will run the Ajax request and update the zone when
>>>> the
>>>> content is available.
>>>>
>>>> I think Geoff's example is actually a bit complicated.  Take a peek at
>>>> the
>>>> t5/core/zone module to see how simple it can be:
>>>> http://people.apache.org/~hlship/t5api/coffeescript/zone.html
>>>>
>>>>
>>>> On Thu, Dec 12, 2013 at 1:47 AM, Geoff Callender <
>>>> geoff.callender.jumpst...@gmail.com> wrote:
>>>>
>>>>> This should give you the clues you need: it's the ZoneUpdater mixin
>>>>> from
>>>>> the upcoming preview of JumpStart 7. It uses a dependency on
>>>>> "t5/core/zone".
>>>>>
>>>>> Example usage:
>>>>>
>>>>> <t:textfield t:id="firstName" t:mixins="zoneUpdater"
>>>>> clientEvent="keyup"
>>>>> event="firstNameChanged" zone="nameZone"/>
>>>>>
>>>>>
>>>>> ZoneUpdater.java:
>>>>>
>>>>> /**
>>>>>    * A simple mixin for attaching javascript that updates a zone on any
>>>>> client-side event.
>>>>>    * Based on
>>>>> http://tinybits.blogspot.com/2010/03/new-and-better-zoneupdater.html
>>>>>    */
>>>>> package jumpstart.web.mixins;
>>>>>
>>>>> import org.apache.tapestry5.BindingConstants;
>>>>> import org.apache.tapestry5.ClientElement;
>>>>> import org.apache.tapestry5.ComponentResources;
>>>>> import org.apache.tapestry5.annotations.Environmental;
>>>>> import org.apache.tapestry5.annotations.InjectContainer;
>>>>> import org.apache.tapestry5.annotations.Parameter;
>>>>> import org.apache.tapestry5.ioc.annotations.Inject;
>>>>> import org.apache.tapestry5.services.javascript.JavaScriptSupport;
>>>>>
>>>>> public class ZoneUpdater {
>>>>>
>>>>>           // Parameters
>>>>>
>>>>>           /**
>>>>>            * The event to listen for on the client. If not specified,
>>>>> zone
>>>>> update can only be triggered manually through
>>>>>            * calling updateZone on the JS object.
>>>>>            */
>>>>>           @Parameter(name = "clientEvent", defaultPrefix =
>>>>> BindingConstants.LITERAL)
>>>>>           private String clientEvent;
>>>>>
>>>>>           /**
>>>>>            * The event to listen for in your component class
>>>>>            */
>>>>>           @Parameter(name = "event", defaultPrefix =
>>>>> BindingConstants.LITERAL, required = true)
>>>>>           private String event;
>>>>>
>>>>>           @Parameter(name = "prefix", defaultPrefix =
>>>>> BindingConstants.LITERAL, value = "default")
>>>>>           private String prefix;
>>>>>
>>>>>           @Parameter(name = "context")
>>>>>           private Object[] context;
>>>>>
>>>>>           /**
>>>>>            * The zone to be updated by us.
>>>>>            */
>>>>>           @Parameter(name = "zone", defaultPrefix =
>>>>> BindingConstants.LITERAL, required = true)
>>>>>           private String zone;
>>>>>
>>>>>           /**
>>>>>            * Set secure to true if https is being used, else set to
>>>>> false.
>>>>>            */
>>>>>           @Parameter(name = "secure", defaultPrefix =
>>>>> BindingConstants.LITERAL, value = "false")
>>>>>           private boolean secure;
>>>>>
>>>>>           // Useful bits and pieces
>>>>>
>>>>>           @Inject
>>>>>           private ComponentResources componentResources;
>>>>>
>>>>>           @Environmental
>>>>>           private JavaScriptSupport javaScriptSupport;
>>>>>
>>>>>           /**
>>>>>            * The element we attach ourselves to
>>>>>            */
>>>>>           @InjectContainer
>>>>>           private ClientElement clientElement;
>>>>>
>>>>>           // The code
>>>>>
>>>>>           void afterRender() {
>>>>>                   String listenerURI =
>>>>> componentResources.createEventLink(event,
>>>>> context).toAbsoluteURI(secure);
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> javaScriptSupport.require("mixins/zone-updater").with(clientElement.getClientId(),
>>>>> clientEvent, listenerURI,
>>>>>                                   zone);
>>>>>           }
>>>>> }
>>>>>
>>>>>
>>>>> zone-updater.js:
>>>>>
>>>>> define(["jquery", "t5/core/zone"], function($, zoneManager) {
>>>>>
>>>>>           return function(elementId, clientEvent, listenerURI,
>>>>> zoneElementId) {
>>>>>                   var element = $("#" + elementId);
>>>>>
>>>>>                   if (clientEvent) {
>>>>>                           element.on(clientEvent, updateZone);
>>>>>                   }
>>>>>
>>>>>                   function updateZone() {
>>>>>                           var listenerURIWithValue = listenerURI;
>>>>>
>>>>>                           if (element.val()) {
>>>>>                                   listenerURIWithValue =
>>>>> appendQueryStringParameter(listenerURIWithValue, 'param',
>>>>> element.val());
>>>>>                           }
>>>>>
>>>>>                           zoneManager.deferredZoneUpdate(zoneElementId,
>>>>> listenerURIWithValue);
>>>>>                   }
>>>>>           }
>>>>>
>>>>>           function appendQueryStringParameter(url, name, value) {
>>>>>                   if (url.indexOf('?') < 0) {
>>>>>                           url += '?'
>>>>>                   }
>>>>>                   else {
>>>>>                           url += '&';
>>>>>                   }
>>>>>                   value = escape(value);
>>>>>                   url += name + '=' + value;
>>>>>                   return url;
>>>>>           }
>>>>>
>>>>> });
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Geoff
>>>>>
>>>>>
>>>>> On 12/12/2013, at 6:50 AM, Matthias wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I'd like to update a zone with a simple ajax call and I'm not sure how
>>>>>
>>>>> its done:
>>>>>>
>>>>>> Javascript
>>>>>> require([ "jquery", "myController"], function($, myController) {
>>>>>>
>>>>>>      $(myController).on("myEvent", function(e) {
>>>>>>         // here i'd like to fire an ajax call that should update my
>>>>>> zone
>>>>>>      });
>>>>>> });
>>>>>>
>>>>>> tml
>>>>>> <t:zone id="myZone" t:id="myZone">
>>>>>>    <table class="table">
>>>>>>      <tbody>
>>>>>>         <tr t:type="loop" source="hits" value="hit">
>>>>>>           <td>${hit.id}</td>
>>>>>>         </tr>
>>>>>>      </tbody>
>>>>>>    </table>
>>>>>> </t:zone>
>>>>>>
>>>>>> Java
>>>>>> public class Search {
>>>>>>
>>>>>>      @Property
>>>>>>      // some other annotations needed?
>>>>>>      List<Hit> hits;
>>>>>>
>>>>>>      @Property
>>>>>>      // some other annotations needed?
>>>>>>      Hit hit; // i need this right?
>>>>>>
>>>>>>      @InjectComponent
>>>>>>      private Zone myZone;
>>>>>>
>>>>>>      private void setupRender() {
>>>>>>          hits = new ArrayList<>();
>>>>>>      }
>>>>>>
>>>>>>      Object onAjaxEvent() {
>>>>>>         hits = // do some solr stuff to get hits
>>>>>>         return myZone;
>>>>>>      }
>>>>>> }
>>>>>>
>>>>>> In 5.3 there was a Tapestry javascript object with a
>>>>>
>>>>> findZoneManagerForZone() method. How is this done in 5.4?
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> 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
>>>
>> ---------------------------------------------------------------------
>> 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
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to