| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | Route = function(router, pathDef, options, group) {  options = options || {};  this.options = options;  this.pathDef = pathDef  // Route.path is deprecated and will be removed in 3.0  this.path = pathDef;  if (options.name) {    this.name = options.name;  }  this._action = options.action || Function.prototype;  this._subscriptions = options.subscriptions || Function.prototype;  this._triggersEnter = options.triggersEnter || [];  this._triggersExit = options.triggersExit || [];  this._subsMap = {};  this._router = router;  this._params = new ReactiveDict();  this._queryParams = new ReactiveDict();  this._routeCloseDep = new Tracker.Dependency();  // tracks the changes in the URL  this._pathChangeDep = new Tracker.Dependency();  this.group = group;};Route.prototype.clearSubscriptions = function() {  this._subsMap = {};};Route.prototype.register = function(name, sub, options) {  this._subsMap[name] = sub;};Route.prototype.getSubscription = function(name) {  return this._subsMap[name];};Route.prototype.getAllSubscriptions = function() {  return this._subsMap;};Route.prototype.callAction = function(current) {  var self = this;  self._action(current.params, current.queryParams);};Route.prototype.callSubscriptions = function(current) {  this.clearSubscriptions();  if (this.group) {    this.group.callSubscriptions(current);  }  this._subscriptions(current.params, current.queryParams);};Route.prototype.getRouteName = function() {  this._routeCloseDep.depend();  return this.name;};Route.prototype.getParam = function(key) {  this._routeCloseDep.depend();  return this._params.get(key);};Route.prototype.getQueryParam = function(key) {  this._routeCloseDep.depend();  return this._queryParams.get(key);};Route.prototype.watchPathChange = function() {  this._pathChangeDep.depend();};Route.prototype.registerRouteClose = function() {  this._params = new ReactiveDict();  this._queryParams = new ReactiveDict();  this._routeCloseDep.changed();  this._pathChangeDep.changed();};Route.prototype.registerRouteChange = function(currentContext, routeChanging) {  // register params  var params = currentContext.params;  this._updateReactiveDict(this._params, params);  // register query params  var queryParams = currentContext.queryParams;  this._updateReactiveDict(this._queryParams, queryParams);  // if the route is changing, we need to defer triggering path changing  // if we did this, old route's path watchers will detect this  // Real issue is, above watcher will get removed with the new route  // So, we don't need to trigger it now  // We are doing it on the route close event. So, if they exists they'll   // get notify that  if(!routeChanging) {    this._pathChangeDep.changed();  }};Route.prototype._updateReactiveDict = function(dict, newValues) {  var currentKeys = _.keys(newValues);  var oldKeys = _.keys(dict.keyDeps);  // set new values  //  params is an array. So, _.each(params) does not works  //  to iterate params  _.each(currentKeys, function(key) {    dict.set(key, newValues[key]);  });  // remove keys which does not exisits here  var removedKeys = _.difference(oldKeys, currentKeys);  _.each(removedKeys, function(key) {    dict.set(key, undefined);  });};
 |