159 lines
26 KiB
JavaScript
159 lines
26 KiB
JavaScript
|
|
"use strict";
|
||
|
|
var core_1 = require('@angular/core');
|
||
|
|
var router_outlet_map_1 = require('./router_outlet_map');
|
||
|
|
var recognize_1 = require('./recognize');
|
||
|
|
var tree_1 = require('./utils/tree');
|
||
|
|
var url_tree_1 = require('./url_tree');
|
||
|
|
var shared_1 = require('./shared');
|
||
|
|
var router_state_1 = require('./router_state');
|
||
|
|
var create_url_tree_1 = require('./create_url_tree');
|
||
|
|
var collection_1 = require('./utils/collection');
|
||
|
|
require('rxjs/add/operator/map');
|
||
|
|
require('rxjs/add/operator/mergeMap');
|
||
|
|
require('rxjs/add/operator/toPromise');
|
||
|
|
var fromPromise_1 = require('rxjs/observable/fromPromise');
|
||
|
|
var forkJoin_1 = require('rxjs/observable/forkJoin');
|
||
|
|
var Router = (function () {
|
||
|
|
function Router(rootComponent, resolver, urlSerializer, outletMap, location) {
|
||
|
|
this.rootComponent = rootComponent;
|
||
|
|
this.resolver = resolver;
|
||
|
|
this.urlSerializer = urlSerializer;
|
||
|
|
this.outletMap = outletMap;
|
||
|
|
this.location = location;
|
||
|
|
this.currentUrlTree = url_tree_1.createEmptyUrlTree();
|
||
|
|
this.currentRouterState = router_state_1.createEmptyState(rootComponent.constructor);
|
||
|
|
this.setUpLocationChangeListener();
|
||
|
|
this.navigateByUrl(this.location.path());
|
||
|
|
}
|
||
|
|
Object.defineProperty(Router.prototype, "routerState", {
|
||
|
|
get: function () {
|
||
|
|
return this.currentRouterState;
|
||
|
|
},
|
||
|
|
enumerable: true,
|
||
|
|
configurable: true
|
||
|
|
});
|
||
|
|
Object.defineProperty(Router.prototype, "urlTree", {
|
||
|
|
get: function () {
|
||
|
|
return this.currentUrlTree;
|
||
|
|
},
|
||
|
|
enumerable: true,
|
||
|
|
configurable: true
|
||
|
|
});
|
||
|
|
Router.prototype.navigateByUrl = function (url) {
|
||
|
|
var urlTree = this.urlSerializer.parse(url);
|
||
|
|
return this.runNavigate(urlTree, false);
|
||
|
|
};
|
||
|
|
Router.prototype.resetConfig = function (config) {
|
||
|
|
this.config = config;
|
||
|
|
};
|
||
|
|
Router.prototype.dispose = function () { this.locationSubscription.unsubscribe(); };
|
||
|
|
Router.prototype.createUrlTree = function (commands, _a) {
|
||
|
|
var _b = _a === void 0 ? {} : _a, relativeTo = _b.relativeTo, queryParameters = _b.queryParameters, fragment = _b.fragment;
|
||
|
|
var a = relativeTo ? relativeTo : this.routerState.root;
|
||
|
|
return create_url_tree_1.createUrlTree(a, this.currentUrlTree, commands, queryParameters, fragment);
|
||
|
|
};
|
||
|
|
Router.prototype.navigate = function (commands, extras) {
|
||
|
|
if (extras === void 0) { extras = {}; }
|
||
|
|
return this.runNavigate(this.createUrlTree(commands, extras));
|
||
|
|
};
|
||
|
|
Router.prototype.serializeUrl = function (url) { return this.urlSerializer.serialize(url); };
|
||
|
|
Router.prototype.parseUrl = function (url) { return this.urlSerializer.parse(url); };
|
||
|
|
Router.prototype.setUpLocationChangeListener = function () {
|
||
|
|
var _this = this;
|
||
|
|
this.locationSubscription = this.location.subscribe(function (change) {
|
||
|
|
_this.runNavigate(_this.urlSerializer.parse(change['url']), change['pop']);
|
||
|
|
});
|
||
|
|
};
|
||
|
|
Router.prototype.runNavigate = function (url, pop) {
|
||
|
|
var _this = this;
|
||
|
|
var r = recognize_1.recognize(this.config, url, this.currentRouterState).mergeMap(function (newState) {
|
||
|
|
return new ActivateRoutes(_this.resolver, newState, _this.currentRouterState).activate(_this.outletMap).map(function () {
|
||
|
|
_this.currentUrlTree = url;
|
||
|
|
_this.currentRouterState = newState;
|
||
|
|
if (!pop) {
|
||
|
|
_this.location.go(_this.urlSerializer.serialize(url));
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
r.subscribe(function (a) { }, function (e) { }, function () { });
|
||
|
|
return r;
|
||
|
|
};
|
||
|
|
return Router;
|
||
|
|
}());
|
||
|
|
exports.Router = Router;
|
||
|
|
var ActivateRoutes = (function () {
|
||
|
|
function ActivateRoutes(resolver, futureState, currState) {
|
||
|
|
this.resolver = resolver;
|
||
|
|
this.futureState = futureState;
|
||
|
|
this.currState = currState;
|
||
|
|
}
|
||
|
|
ActivateRoutes.prototype.activate = function (parentOutletMap) {
|
||
|
|
var currRoot = this.currState ? tree_1.rootNode(this.currState) : null;
|
||
|
|
var futureRoot = tree_1.rootNode(this.futureState);
|
||
|
|
return this.activateChildRoutes(futureRoot, currRoot, parentOutletMap);
|
||
|
|
};
|
||
|
|
ActivateRoutes.prototype.activateChildRoutes = function (futureNode, currNode, outletMap) {
|
||
|
|
var _this = this;
|
||
|
|
var prevChildren = nodeChildrenAsMap(currNode);
|
||
|
|
var observables = [];
|
||
|
|
futureNode.children.forEach(function (c) {
|
||
|
|
observables.push(_this.activateRoutes(c, prevChildren[c.value.outlet], outletMap).toPromise());
|
||
|
|
delete prevChildren[c.value.outlet];
|
||
|
|
});
|
||
|
|
collection_1.forEach(prevChildren, function (v, k) { return _this.deactivateOutletAndItChildren(outletMap._outlets[k]); });
|
||
|
|
return forkJoin_1.forkJoin(observables);
|
||
|
|
};
|
||
|
|
ActivateRoutes.prototype.activateRoutes = function (futureNode, currNode, parentOutletMap) {
|
||
|
|
var _this = this;
|
||
|
|
var future = futureNode.value;
|
||
|
|
var curr = currNode ? currNode.value : null;
|
||
|
|
var outlet = getOutlet(parentOutletMap, futureNode.value);
|
||
|
|
if (future === curr) {
|
||
|
|
return this.activateChildRoutes(futureNode, currNode, outlet.outletMap);
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
this.deactivateOutletAndItChildren(outlet);
|
||
|
|
var outletMap_1 = new router_outlet_map_1.RouterOutletMap();
|
||
|
|
return this.activateNewRoutes(outletMap_1, future, outlet).mergeMap(function () {
|
||
|
|
return _this.activateChildRoutes(futureNode, currNode, outletMap_1);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
ActivateRoutes.prototype.activateNewRoutes = function (outletMap, future, outlet) {
|
||
|
|
var resolved = core_1.ReflectiveInjector.resolve([
|
||
|
|
{ provide: router_state_1.ActivatedRoute, useValue: future },
|
||
|
|
{ provide: router_outlet_map_1.RouterOutletMap, useValue: outletMap }
|
||
|
|
]);
|
||
|
|
return fromPromise_1.fromPromise(this.resolver.resolveComponent(future.component)).
|
||
|
|
map(function (factory) { return outlet.activate(factory, resolved, outletMap); });
|
||
|
|
};
|
||
|
|
ActivateRoutes.prototype.deactivateOutletAndItChildren = function (outlet) {
|
||
|
|
var _this = this;
|
||
|
|
if (outlet && outlet.isActivated) {
|
||
|
|
collection_1.forEach(outlet.outletMap._outlets, function (v, k) { return _this.deactivateOutletAndItChildren(v); });
|
||
|
|
outlet.deactivate();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
return ActivateRoutes;
|
||
|
|
}());
|
||
|
|
function nodeChildrenAsMap(node) {
|
||
|
|
return node ?
|
||
|
|
node.children.reduce(function (m, c) {
|
||
|
|
m[c.value.outlet] = c;
|
||
|
|
return m;
|
||
|
|
}, {}) :
|
||
|
|
{};
|
||
|
|
}
|
||
|
|
function getOutlet(outletMap, route) {
|
||
|
|
var outlet = outletMap._outlets[route.outlet];
|
||
|
|
if (!outlet) {
|
||
|
|
if (route.outlet === shared_1.PRIMARY_OUTLET) {
|
||
|
|
throw new Error("Cannot find primary outlet");
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
throw new Error("Cannot find the outlet " + route.outlet);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return outlet;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUJBQXNELGVBQWUsQ0FBQyxDQUFBO0FBR3RFLGtDQUFnQyxxQkFBcUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUEwQixhQUFhLENBQUMsQ0FBQTtBQUN4QyxxQkFBbUMsY0FBYyxDQUFDLENBQUE7QUFDbEQseUJBQTRDLFlBQVksQ0FBQyxDQUFBO0FBQ3pELHVCQUF1QyxVQUFVLENBQUMsQ0FBQTtBQUNsRCw2QkFBNkQsZ0JBQWdCLENBQUMsQ0FBQTtBQUc5RSxnQ0FBOEIsbUJBQW1CLENBQUMsQ0FBQTtBQUNsRCwyQkFBd0Isb0JBQW9CLENBQUMsQ0FBQTtBQUc3QyxRQUFPLHVCQUF1QixDQUFDLENBQUE7QUFDL0IsUUFBTyw0QkFBNEIsQ0FBQyxDQUFBO0FBQ3BDLFFBQU8sNkJBQTZCLENBQUMsQ0FBQTtBQUNyQyw0QkFBMEIsNkJBQTZCLENBQUMsQ0FBQTtBQUN4RCx5QkFBdUIsMEJBQTBCLENBQUMsQ0FBQTtBQU9sRDtJQVNFLGdCQUFvQixhQUFvQixFQUFVLFFBQTJCLEVBQVUsYUFBNEIsRUFBVSxTQUEwQixFQUFVLFFBQWtCO1FBQS9KLGtCQUFhLEdBQWIsYUFBYSxDQUFPO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNqTCxJQUFJLENBQUMsY0FBYyxHQUFHLDZCQUFrQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLCtCQUFnQixDQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxF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
|