Josh
Josh

Reputation: 7602

Listening to events in Durandal

I'm reviewing the Durandal documentation, and I can't find a concrete implementation of listening for Durandal events, e.g, router events.

Can someone point me to the docs, or (if there is no documentation on this) an example?

Upvotes: 0

Views: 2665

Answers (2)

nimgrg
nimgrg

Reputation: 582

Here's some example code from the project I have worked in:

//authentication.js
define(['durandal/events'], function(events){
      var authentication = {};

      events.includeIn(authentication);

      //perform login then trigger events to whoever is listening...
      authentication.trigger('logged:on',user);

      //perfom logoff then trigger events to whoever is listening...
      authentication.trigger('logged:off');

      return {
          authentication: authentication
      }
});


//logon.js
//pull in authenticaion
define(['authentication'], function(authentication){

      authentication.on('logged:on',loggedOn);

      //callback that gets called when the logged:on event is fired on authentication
      function loggedOn(user){
        console.log(user);
      }

});        

Upvotes: 0

Erikas Pliauksta
Erikas Pliauksta

Reputation: 1532

In your view model you should listen to activator events. Link. check this example from Durandal starter template. It is listening to activate and canDeactivate events:

define(['plugins/http', 'durandal/app', 'knockout'], function (http, app, ko) {
    //Note: This module exports an object.
    //That means that every module that "requires" it will get the same object instance.
    //If you wish to be able to create multiple instances, instead export a function.
    //See the "welcome" module for an example of function export.

    return {
        displayName: 'Flickr',
        images: ko.observableArray([]),
        activate: function () {
            //the router's activator calls this function and waits for it to complete before proceding
            if (this.images().length > 0) {
                return;
            }

            var that = this;
            return http.jsonp('http://api.flickr.com/services/feeds/photos_public.gne', { tags: 'mount ranier', tagmode: 'any', format: 'json' }, 'jsoncallback').then(function(response) {
                that.images(response.items);
            });
        },
        select: function(item) {
            //the app model allows easy display of modal dialogs by passing a view model
            //views are usually located by convention, but you an specify it as well with viewUrl
            item.viewUrl = 'views/detail';
            app.showDialog(item);
        },
        canDeactivate: function () {
            //the router's activator calls this function to see if it can leave the screen
            return app.showMessage('Are you sure you want to leave this page?', 'Navigate', ['Yes', 'No']);
        }
    };
});

Upvotes: 1

Related Questions