@angular/router 2.0.0-rc.1 → 2.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{router.umd.js → bundles/router.umd.js} +727 -637
- package/bundles/router.umd.min.js +2 -0
- package/esm/index.d.ts +7 -25
- package/esm/index.js +10 -30
- package/esm/index.js.map +1 -1
- package/esm/src/constants.js +4 -4
- package/esm/src/constants.js.map +1 -1
- package/esm/src/constants.metadata.json +1 -1
- package/esm/src/core_private.d.ts +3 -2
- package/esm/src/core_private.js +3 -2
- package/esm/src/core_private.js.map +1 -1
- package/esm/src/core_private.metadata.json +1 -1
- package/esm/src/directives/router_directives.d.ts +21 -0
- package/esm/src/directives/router_directives.js +24 -0
- package/esm/src/directives/router_directives.js.map +1 -0
- package/esm/src/directives/router_directives.metadata.json +1 -0
- package/esm/src/directives/router_link.d.ts +4 -2
- package/esm/src/directives/router_link.js +21 -13
- package/esm/src/directives/router_link.js.map +1 -1
- package/esm/src/directives/router_link.metadata.json +1 -1
- package/esm/src/directives/router_outlet.d.ts +6 -6
- package/esm/src/directives/router_outlet.js +13 -11
- package/esm/src/directives/router_outlet.js.map +1 -1
- package/esm/src/directives/router_outlet.metadata.json +1 -1
- package/esm/src/facade/async.d.ts +11 -4
- package/esm/src/facade/async.js +25 -15
- package/esm/src/facade/async.js.map +1 -1
- package/esm/src/facade/base_wrapped_exception.js +4 -4
- package/esm/src/facade/base_wrapped_exception.js.map +1 -1
- package/esm/src/facade/collection.js +1 -1
- package/esm/src/facade/collection.js.map +1 -1
- package/esm/src/facade/collection.metadata.json +1 -1
- package/esm/src/facade/exception_handler.d.ts +2 -11
- package/esm/src/facade/exception_handler.js +8 -7
- package/esm/src/facade/exception_handler.js.map +1 -1
- package/esm/src/facade/exceptions.d.ts +4 -0
- package/esm/src/facade/exceptions.js +6 -2
- package/esm/src/facade/exceptions.js.map +1 -1
- package/esm/src/facade/exceptions.metadata.json +1 -0
- package/esm/src/facade/lang.d.ts +6 -4
- package/esm/src/facade/lang.js +12 -11
- package/esm/src/facade/lang.js.map +1 -1
- package/esm/src/facade/lang.metadata.json +1 -1
- package/esm/src/facade/promise.js.map +1 -1
- package/esm/src/interfaces.js.map +1 -1
- package/esm/src/lifecycle_reflector.js.map +1 -1
- package/esm/src/link.d.ts +1 -1
- package/esm/src/link.js +31 -18
- package/esm/src/link.js.map +1 -1
- package/esm/src/metadata/decorators.d.ts +1 -1
- package/esm/src/metadata/decorators.js +1 -1
- package/esm/src/metadata/decorators.js.map +1 -1
- package/esm/src/metadata/decorators.metadata.json +1 -1
- package/esm/src/metadata/metadata.d.ts +3 -3
- package/esm/src/metadata/metadata.js +1 -1
- package/esm/src/metadata/metadata.js.map +1 -1
- package/esm/src/recognize.d.ts +3 -3
- package/esm/src/recognize.js +57 -41
- package/esm/src/recognize.js.map +1 -1
- package/esm/src/router.d.ts +3 -23
- package/esm/src/router.js +54 -58
- package/esm/src/router.js.map +1 -1
- package/esm/src/router_providers.d.ts +1 -1
- package/esm/src/router_providers.js +3 -7
- package/esm/src/router_providers.js.map +1 -1
- package/esm/src/router_providers.metadata.json +1 -1
- package/esm/src/router_providers_common.d.ts +7 -0
- package/esm/src/router_providers_common.js +10 -7
- package/esm/src/router_providers_common.js.map +1 -1
- package/esm/src/router_providers_common.metadata.json +1 -1
- package/esm/src/router_url_serializer.js +9 -9
- package/esm/src/router_url_serializer.js.map +1 -1
- package/esm/src/segments.d.ts +7 -12
- package/esm/src/segments.js +27 -45
- package/esm/src/segments.js.map +1 -1
- package/esm/src/segments.metadata.json +1 -0
- package/esm/testing/router_testing_providers.js +10 -3
- package/esm/testing/router_testing_providers.js.map +1 -1
- package/esm/testing/router_testing_providers.metadata.json +1 -1
- package/esm/testing.js.map +1 -1
- package/index.d.ts +7 -25
- package/index.js +22 -39
- package/index.js.map +1 -1
- package/package.json +8 -4
- package/src/constants.js +4 -4
- package/src/constants.js.map +1 -1
- package/src/constants.metadata.json +1 -1
- package/src/core_private.d.ts +3 -2
- package/src/core_private.js +1 -0
- package/src/core_private.js.map +1 -1
- package/src/core_private.metadata.json +1 -1
- package/src/directives/router_directives.d.ts +21 -0
- package/src/directives/router_directives.js +25 -0
- package/src/directives/router_directives.js.map +1 -0
- package/src/directives/router_directives.metadata.json +1 -0
- package/src/directives/router_link.d.ts +4 -2
- package/src/directives/router_link.js +20 -12
- package/src/directives/router_link.js.map +1 -1
- package/src/directives/router_link.metadata.json +1 -1
- package/src/directives/router_outlet.d.ts +6 -6
- package/src/directives/router_outlet.js +13 -11
- package/src/directives/router_outlet.js.map +1 -1
- package/src/directives/router_outlet.metadata.json +1 -1
- package/src/facade/async.d.ts +11 -4
- package/src/facade/async.js +27 -17
- package/src/facade/async.js.map +1 -1
- package/src/facade/base_wrapped_exception.js +4 -4
- package/src/facade/base_wrapped_exception.js.map +1 -1
- package/src/facade/collection.js.map +1 -1
- package/src/facade/collection.metadata.json +1 -1
- package/src/facade/exception_handler.d.ts +2 -11
- package/src/facade/exception_handler.js +8 -7
- package/src/facade/exception_handler.js.map +1 -1
- package/src/facade/exceptions.d.ts +4 -0
- package/src/facade/exceptions.js +6 -2
- package/src/facade/exceptions.js.map +1 -1
- package/src/facade/exceptions.metadata.json +1 -0
- package/src/facade/lang.d.ts +6 -4
- package/src/facade/lang.js +12 -11
- package/src/facade/lang.js.map +1 -1
- package/src/facade/lang.metadata.json +1 -1
- package/src/facade/promise.js.map +1 -1
- package/src/interfaces.js.map +1 -1
- package/src/lifecycle_reflector.js.map +1 -1
- package/src/link.d.ts +1 -1
- package/src/link.js +33 -18
- package/src/link.js.map +1 -1
- package/src/metadata/decorators.d.ts +1 -1
- package/src/metadata/decorators.js +1 -1
- package/src/metadata/decorators.js.map +1 -1
- package/src/metadata/decorators.metadata.json +1 -1
- package/src/metadata/metadata.d.ts +3 -3
- package/src/metadata/metadata.js +1 -1
- package/src/metadata/metadata.js.map +1 -1
- package/src/recognize.d.ts +3 -3
- package/src/recognize.js +62 -42
- package/src/recognize.js.map +1 -1
- package/src/router.d.ts +3 -23
- package/src/router.js +64 -64
- package/src/router.js.map +1 -1
- package/src/router_providers.d.ts +1 -1
- package/src/router_providers.js +3 -7
- package/src/router_providers.js.map +1 -1
- package/src/router_providers.metadata.json +1 -1
- package/src/router_providers_common.d.ts +7 -0
- package/src/router_providers_common.js +10 -5
- package/src/router_providers_common.js.map +1 -1
- package/src/router_providers_common.metadata.json +1 -1
- package/src/router_url_serializer.js +8 -8
- package/src/router_url_serializer.js.map +1 -1
- package/src/segments.d.ts +7 -12
- package/src/segments.js +26 -44
- package/src/segments.js.map +1 -1
- package/src/segments.metadata.json +1 -0
- package/testing/router_testing_providers.js +9 -2
- package/testing/router_testing_providers.js.map +1 -1
- package/testing/router_testing_providers.metadata.json +1 -1
- package/testing.js.map +1 -1
- package/esm/index.metadata.json +0 -1
- package/index.metadata.json +0 -1
package/src/recognize.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var segments_1 = require('./segments');
|
|
3
|
-
var metadata_1 = require('./metadata/metadata');
|
|
4
|
-
var lang_1 = require('./facade/lang');
|
|
5
|
-
var collection_1 = require('./facade/collection');
|
|
6
|
-
var promise_1 = require('./facade/promise');
|
|
7
2
|
var core_1 = require('@angular/core');
|
|
8
3
|
var constants_1 = require('./constants');
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
var core_private_1 = require('./core_private');
|
|
5
|
+
var collection_1 = require('./facade/collection');
|
|
6
|
+
var lang_1 = require('./facade/lang');
|
|
7
|
+
var promise_1 = require('./facade/promise');
|
|
8
|
+
var metadata_1 = require('./metadata/metadata');
|
|
9
|
+
var segments_1 = require('./segments');
|
|
10
|
+
function recognize(componentResolver, rootComponent, url, existingTree) {
|
|
11
|
+
var matched = new _MatchResult(rootComponent, [url.root], {}, segments_1.rootNode(url).children, []);
|
|
12
|
+
return _constructSegment(componentResolver, matched, segments_1.rootNode(existingTree))
|
|
13
|
+
.then(function (roots) { return new segments_1.RouteTree(roots[0]); });
|
|
14
14
|
}
|
|
15
15
|
exports.recognize = recognize;
|
|
16
|
-
function _recognize(componentResolver,
|
|
17
|
-
var metadata = _readMetadata(
|
|
16
|
+
function _recognize(componentResolver, parentComponent, url, existingSegments) {
|
|
17
|
+
var metadata = _readMetadata(parentComponent); // should read from the factory instead
|
|
18
18
|
if (lang_1.isBlank(metadata)) {
|
|
19
|
-
throw new core_1.BaseException("Component '" + lang_1.stringify(
|
|
19
|
+
throw new core_1.BaseException("Component '" + lang_1.stringify(parentComponent) + "' does not have route configuration");
|
|
20
20
|
}
|
|
21
21
|
var match;
|
|
22
22
|
try {
|
|
@@ -25,49 +25,60 @@ function _recognize(componentResolver, parentType, url) {
|
|
|
25
25
|
catch (e) {
|
|
26
26
|
return promise_1.PromiseWrapper.reject(e, null);
|
|
27
27
|
}
|
|
28
|
-
var
|
|
29
|
-
var
|
|
28
|
+
var segmentsWithRightOutlet = existingSegments.filter(function (r) { return r.value.outlet == match.outlet; });
|
|
29
|
+
var segmentWithRightOutlet = segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;
|
|
30
|
+
var main = _constructSegment(componentResolver, match, segmentWithRightOutlet);
|
|
31
|
+
var aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)
|
|
32
|
+
.then(_checkOutletNameUniqueness);
|
|
30
33
|
return promise_1.PromiseWrapper.all([main, aux]).then(collection_1.ListWrapper.flatten);
|
|
31
34
|
}
|
|
32
|
-
function _recognizeMany(componentResolver,
|
|
33
|
-
var recognized = urls.map(function (u) { return _recognize(componentResolver,
|
|
35
|
+
function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
|
|
36
|
+
var recognized = urls.map(function (u) { return _recognize(componentResolver, parentComponent, u, existingSegments); });
|
|
34
37
|
return promise_1.PromiseWrapper.all(recognized).then(collection_1.ListWrapper.flatten);
|
|
35
38
|
}
|
|
36
|
-
function _constructSegment(componentResolver, matched) {
|
|
37
|
-
return componentResolver.resolveComponent(matched.component)
|
|
38
|
-
|
|
39
|
-
var
|
|
40
|
-
lang_1.isBlank(matched.consumedUrlSegments[0].outlet) ?
|
|
41
|
-
constants_1.DEFAULT_OUTLET_NAME :
|
|
42
|
-
matched.consumedUrlSegments[0].outlet;
|
|
43
|
-
var segment = new segments_1.RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet, matched.component, factory);
|
|
39
|
+
function _constructSegment(componentResolver, matched, existingSegment) {
|
|
40
|
+
return componentResolver.resolveComponent(matched.component).then(function (factory) {
|
|
41
|
+
var segment = _createOrReuseSegment(matched, factory, existingSegment);
|
|
42
|
+
var existingChildren = lang_1.isPresent(existingSegment) ? existingSegment.children : [];
|
|
44
43
|
if (matched.leftOverUrl.length > 0) {
|
|
45
|
-
return _recognizeMany(componentResolver,
|
|
44
|
+
return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
|
|
46
45
|
.then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
|
|
47
46
|
}
|
|
48
47
|
else {
|
|
49
|
-
return _recognizeLeftOvers(componentResolver,
|
|
48
|
+
return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
|
|
50
49
|
.then(function (children) { return [new segments_1.TreeNode(segment, children)]; });
|
|
51
50
|
}
|
|
52
51
|
});
|
|
53
52
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
function _createOrReuseSegment(matched, factory, segmentNode) {
|
|
54
|
+
var segment = lang_1.isPresent(segmentNode) ? segmentNode.value : null;
|
|
55
|
+
if (lang_1.isPresent(segment) && segments_1.equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&
|
|
56
|
+
collection_1.StringMapWrapper.equals(segment.parameters, matched.parameters) &&
|
|
57
|
+
segment.outlet == matched.outlet && factory.componentType == segment.type) {
|
|
58
|
+
return segment;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return new segments_1.RouteSegment(matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType, factory);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function _recognizeLeftOvers(componentResolver, parentComponent, existingSegments) {
|
|
65
|
+
return componentResolver.resolveComponent(parentComponent).then(function (factory) {
|
|
66
|
+
var metadata = _readMetadata(factory.componentType);
|
|
58
67
|
if (lang_1.isBlank(metadata)) {
|
|
59
68
|
return [];
|
|
60
69
|
}
|
|
61
|
-
var r = metadata.routes.filter(function (r) { return r.path ==
|
|
70
|
+
var r = metadata.routes.filter(function (r) { return r.path == '' || r.path == '/'; });
|
|
62
71
|
if (r.length === 0) {
|
|
63
72
|
return promise_1.PromiseWrapper.resolve([]);
|
|
64
73
|
}
|
|
65
74
|
else {
|
|
66
|
-
|
|
75
|
+
var segmentsWithMatchingOutlet = existingSegments.filter(function (r) { return r.value.outlet == constants_1.DEFAULT_OUTLET_NAME; });
|
|
76
|
+
var segmentWithMatchingOutlet_1 = segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;
|
|
77
|
+
var existingChildren = lang_1.isPresent(segmentWithMatchingOutlet_1) ? segmentWithMatchingOutlet_1.children : [];
|
|
78
|
+
return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)
|
|
67
79
|
.then(function (children) {
|
|
68
|
-
return componentResolver.resolveComponent(r[0].component)
|
|
69
|
-
|
|
70
|
-
var segment = new segments_1.RouteSegment([], {}, constants_1.DEFAULT_OUTLET_NAME, r[0].component, factory);
|
|
80
|
+
return componentResolver.resolveComponent(r[0].component).then(function (factory) {
|
|
81
|
+
var segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet_1);
|
|
71
82
|
return [new segments_1.TreeNode(segment, children)];
|
|
72
83
|
});
|
|
73
84
|
});
|
|
@@ -82,15 +93,15 @@ function _match(metadata, url) {
|
|
|
82
93
|
return matchingResult;
|
|
83
94
|
}
|
|
84
95
|
}
|
|
85
|
-
var availableRoutes = metadata.routes.map(function (r) { return ("'" + r.path + "'"); }).join(
|
|
96
|
+
var availableRoutes = metadata.routes.map(function (r) { return ("'" + r.path + "'"); }).join(', ');
|
|
86
97
|
throw new core_1.BaseException("Cannot match any routes. Current segment: '" + url.value + "'. Available routes: [" + availableRoutes + "].");
|
|
87
98
|
}
|
|
88
99
|
function _matchWithParts(route, url) {
|
|
89
|
-
var path = route.path.startsWith(
|
|
90
|
-
if (path ==
|
|
100
|
+
var path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
|
|
101
|
+
if (path == '*') {
|
|
91
102
|
return new _MatchResult(route.component, [], null, [], []);
|
|
92
103
|
}
|
|
93
|
-
var parts = path.split(
|
|
104
|
+
var parts = path.split('/');
|
|
94
105
|
var positionalParams = {};
|
|
95
106
|
var consumedUrlSegments = [];
|
|
96
107
|
var lastParent = null;
|
|
@@ -102,7 +113,7 @@ function _matchWithParts(route, url) {
|
|
|
102
113
|
var p_1 = parts[i];
|
|
103
114
|
var isLastSegment = i === parts.length - 1;
|
|
104
115
|
var isLastParent = i === parts.length - 2;
|
|
105
|
-
var isPosParam = p_1.startsWith(
|
|
116
|
+
var isPosParam = p_1.startsWith(':');
|
|
106
117
|
if (!isPosParam && p_1 != current.value.segment)
|
|
107
118
|
return null;
|
|
108
119
|
if (isLastSegment) {
|
|
@@ -143,10 +154,19 @@ var _MatchResult = (function () {
|
|
|
143
154
|
this.leftOverUrl = leftOverUrl;
|
|
144
155
|
this.aux = aux;
|
|
145
156
|
}
|
|
157
|
+
Object.defineProperty(_MatchResult.prototype, "outlet", {
|
|
158
|
+
get: function () {
|
|
159
|
+
return this.consumedUrlSegments.length === 0 || lang_1.isBlank(this.consumedUrlSegments[0].outlet) ?
|
|
160
|
+
constants_1.DEFAULT_OUTLET_NAME :
|
|
161
|
+
this.consumedUrlSegments[0].outlet;
|
|
162
|
+
},
|
|
163
|
+
enumerable: true,
|
|
164
|
+
configurable: true
|
|
165
|
+
});
|
|
146
166
|
return _MatchResult;
|
|
147
167
|
}());
|
|
148
168
|
function _readMetadata(componentType) {
|
|
149
|
-
var metadata =
|
|
169
|
+
var metadata = core_private_1.reflector.annotations(componentType).filter(function (f) { return f instanceof metadata_1.RoutesMetadata; });
|
|
150
170
|
return collection_1.ListWrapper.first(metadata);
|
|
151
171
|
}
|
|
152
172
|
//# sourceMappingURL=recognize.js.map
|
package/src/recognize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/recognize.ts"],"names":[],"mappings":"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","sourcesContent":["interface DecoratorInvocation {\n type: Function;\n args?: any[];\n }\n import {RouteSegment, UrlSegment, Tree, TreeNode, rootNode, UrlTree, RouteTree} from './segments';\nimport {RoutesMetadata, RouteMetadata} from './metadata/metadata';\nimport {Type, isBlank, isPresent, stringify} from './facade/lang';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {PromiseWrapper} from './facade/promise';\nimport {BaseException} from '@angular/core';\nimport {ComponentResolver} from '@angular/core';\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {reflector} from '@angular/core';\n\n// TODO: vsavkin: recognize should take the old tree and merge it\nexport function recognize(componentResolver: ComponentResolver, type: Type,\n url: UrlTree): Promise<RouteTree> {\n let matched = new _MatchResult(type, [url.root], {}, rootNode(url).children, []);\n return _constructSegment(componentResolver, matched).then(roots => new RouteTree(roots[0]));\n}\n\nfunction _recognize(componentResolver: ComponentResolver, parentType: Type,\n url: TreeNode<UrlSegment>): Promise<TreeNode<RouteSegment>[]> {\n let metadata = _readMetadata(parentType); // should read from the factory instead\n if (isBlank(metadata)) {\n throw new BaseException(\n `Component '${stringify(parentType)}' does not have route configuration`);\n }\n\n let match;\n try {\n match = _match(metadata, url);\n } catch (e) {\n return PromiseWrapper.reject(e, null);\n }\n\n let main = _constructSegment(componentResolver, match);\n let aux =\n _recognizeMany(componentResolver, parentType, match.aux).then(_checkOutletNameUniqueness);\n return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);\n}\n\nfunction _recognizeMany(componentResolver: ComponentResolver, parentType: Type,\n urls: TreeNode<UrlSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let recognized = urls.map(u => _recognize(componentResolver, parentType, u));\n return PromiseWrapper.all(recognized).then(ListWrapper.flatten);\n}\n\nfunction _constructSegment(componentResolver: ComponentResolver,\n matched: _MatchResult): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(matched.component)\n .then(factory => {\n let urlOutlet = matched.consumedUrlSegments.length === 0 ||\n isBlank(matched.consumedUrlSegments[0].outlet) ?\n DEFAULT_OUTLET_NAME :\n matched.consumedUrlSegments[0].outlet;\n\n let segment = new RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet,\n matched.component, factory);\n\n if (matched.leftOverUrl.length > 0) {\n return _recognizeMany(componentResolver, matched.component, matched.leftOverUrl)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n } else {\n return _recognizeLeftOvers(componentResolver, matched.component)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n }\n });\n}\n\nfunction _recognizeLeftOvers(componentResolver: ComponentResolver,\n parentType: Type): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(parentType)\n .then(factory => {\n let metadata = _readMetadata(parentType);\n if (isBlank(metadata)) {\n return [];\n }\n\n let r = (<any[]>metadata.routes).filter(r => r.path == \"\" || r.path == \"/\");\n if (r.length === 0) {\n return PromiseWrapper.resolve([]);\n } else {\n return _recognizeLeftOvers(componentResolver, r[0].component)\n .then(children => {\n return componentResolver.resolveComponent(r[0].component)\n .then(factory => {\n let segment =\n new RouteSegment([], {}, DEFAULT_OUTLET_NAME, r[0].component, factory);\n return [new TreeNode<RouteSegment>(segment, children)];\n });\n });\n }\n });\n}\n\nfunction _match(metadata: RoutesMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n for (let r of metadata.routes) {\n let matchingResult = _matchWithParts(r, url);\n if (isPresent(matchingResult)) {\n return matchingResult;\n }\n }\n let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(\", \");\n throw new BaseException(\n `Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);\n}\n\nfunction _matchWithParts(route: RouteMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n let path = route.path.startsWith(\"/\") ? route.path.substring(1) : route.path;\n\n if (path == \"*\") {\n return new _MatchResult(route.component, [], null, [], []);\n }\n\n let parts = path.split(\"/\");\n let positionalParams = {};\n let consumedUrlSegments = [];\n\n let lastParent: TreeNode<UrlSegment> = null;\n let lastSegment: TreeNode<UrlSegment> = null;\n\n let current = url;\n for (let i = 0; i < parts.length; ++i) {\n if (isBlank(current)) return null;\n\n let p = parts[i];\n let isLastSegment = i === parts.length - 1;\n let isLastParent = i === parts.length - 2;\n let isPosParam = p.startsWith(\":\");\n\n if (!isPosParam && p != current.value.segment) return null;\n if (isLastSegment) {\n lastSegment = current;\n }\n if (isLastParent) {\n lastParent = current;\n }\n\n if (isPosParam) {\n positionalParams[p.substring(1)] = current.value.segment;\n }\n\n consumedUrlSegments.push(current.value);\n\n current = ListWrapper.first(current.children);\n }\n\n let p = lastSegment.value.parameters;\n let parameters =\n <{[key: string]: string}>StringMapWrapper.merge(p, positionalParams);\n let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : [];\n\n return new _MatchResult(route.component, consumedUrlSegments, parameters, lastSegment.children,\n axuUrlSubtrees);\n}\n\nfunction _checkOutletNameUniqueness(nodes: TreeNode<RouteSegment>[]): TreeNode<RouteSegment>[] {\n let names = {};\n nodes.forEach(n => {\n let segmentWithSameOutletName = names[n.value.outlet];\n if (isPresent(segmentWithSameOutletName)) {\n let p = segmentWithSameOutletName.stringifiedUrlSegments;\n let c = n.value.stringifiedUrlSegments;\n throw new BaseException(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`);\n }\n names[n.value.outlet] = n.value;\n });\n return nodes;\n}\n\nclass _MatchResult {\n constructor(public component: Type, public consumedUrlSegments: UrlSegment[],\n public parameters: {[key: string]: string},\n public leftOverUrl: TreeNode<UrlSegment>[], public aux: TreeNode<UrlSegment>[]) {}\n}\n\nfunction _readMetadata(componentType: Type) {\n let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);\n return ListWrapper.first(metadata);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recognize.js","sourceRoot":"","sources":["../../../../modules/@angular/router/src/recognize.ts"],"names":[],"mappings":"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","sourcesContent":["import {BaseException, ComponentFactory, ComponentResolver} from '@angular/core';\n\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {reflector} from './core_private';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {Type, isBlank, isPresent, stringify} from './facade/lang';\nimport {PromiseWrapper} from './facade/promise';\nimport {RouteMetadata, RoutesMetadata} from './metadata/metadata';\nimport {RouteSegment, RouteTree, Tree, TreeNode, UrlSegment, UrlTree, equalUrlSegments, rootNode} from './segments';\n\nexport function recognize(\n componentResolver: ComponentResolver, rootComponent: Type, url: UrlTree,\n existingTree: RouteTree): Promise<RouteTree> {\n let matched = new _MatchResult(rootComponent, [url.root], {}, rootNode(url).children, []);\n return _constructSegment(componentResolver, matched, rootNode(existingTree))\n .then(roots => new RouteTree(roots[0]));\n}\n\nfunction _recognize(\n componentResolver: ComponentResolver, parentComponent: Type, url: TreeNode<UrlSegment>,\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let metadata = _readMetadata(parentComponent); // should read from the factory instead\n if (isBlank(metadata)) {\n throw new BaseException(\n `Component '${stringify(parentComponent)}' does not have route configuration`);\n }\n\n let match: any /** TODO #9100 */;\n try {\n match = _match(metadata, url);\n } catch (e) {\n return PromiseWrapper.reject(e, null);\n }\n\n let segmentsWithRightOutlet = existingSegments.filter(r => r.value.outlet == match.outlet);\n let segmentWithRightOutlet =\n segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;\n\n let main = _constructSegment(componentResolver, match, segmentWithRightOutlet);\n let aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)\n .then(_checkOutletNameUniqueness);\n return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);\n}\n\nfunction _recognizeMany(\n componentResolver: ComponentResolver, parentComponent: Type, urls: TreeNode<UrlSegment>[],\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n let recognized =\n urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments));\n return PromiseWrapper.all(recognized).then(ListWrapper.flatten);\n}\n\nfunction _constructSegment(\n componentResolver: ComponentResolver, matched: _MatchResult,\n existingSegment: TreeNode<RouteSegment>): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(matched.component).then(factory => {\n let segment = _createOrReuseSegment(matched, factory, existingSegment);\n let existingChildren = isPresent(existingSegment) ? existingSegment.children : [];\n\n if (matched.leftOverUrl.length > 0) {\n return _recognizeMany(\n componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n } else {\n return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)\n .then(children => [new TreeNode<RouteSegment>(segment, children)]);\n }\n });\n}\n\nfunction _createOrReuseSegment(\n matched: _MatchResult, factory: ComponentFactory<any>,\n segmentNode: TreeNode<RouteSegment>): RouteSegment {\n let segment = isPresent(segmentNode) ? segmentNode.value : null;\n\n if (isPresent(segment) && equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&\n StringMapWrapper.equals(segment.parameters, matched.parameters) &&\n segment.outlet == matched.outlet && factory.componentType == segment.type) {\n return segment;\n } else {\n return new RouteSegment(\n matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType,\n factory);\n }\n}\n\nfunction _recognizeLeftOvers(\n componentResolver: ComponentResolver, parentComponent: Type,\n existingSegments: TreeNode<RouteSegment>[]): Promise<TreeNode<RouteSegment>[]> {\n return componentResolver.resolveComponent(parentComponent).then(factory => {\n let metadata = _readMetadata(factory.componentType);\n if (isBlank(metadata)) {\n return [];\n }\n\n let r = (<any[]>metadata.routes).filter(r => r.path == '' || r.path == '/');\n if (r.length === 0) {\n return PromiseWrapper.resolve([]);\n } else {\n let segmentsWithMatchingOutlet =\n existingSegments.filter(r => r.value.outlet == DEFAULT_OUTLET_NAME);\n let segmentWithMatchingOutlet =\n segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;\n let existingChildren =\n isPresent(segmentWithMatchingOutlet) ? segmentWithMatchingOutlet.children : [];\n\n return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)\n .then(children => {\n return componentResolver.resolveComponent(r[0].component).then(factory => {\n let segment = _createOrReuseSegment(\n new _MatchResult(r[0].component, [], {}, [], []), factory,\n segmentWithMatchingOutlet);\n return [new TreeNode<RouteSegment>(segment, children)];\n });\n });\n }\n });\n}\n\nfunction _match(metadata: RoutesMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n for (let r of metadata.routes) {\n let matchingResult = _matchWithParts(r, url);\n if (isPresent(matchingResult)) {\n return matchingResult;\n }\n }\n let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', ');\n throw new BaseException(\n `Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);\n}\n\nfunction _matchWithParts(route: RouteMetadata, url: TreeNode<UrlSegment>): _MatchResult {\n let path = route.path.startsWith('/') ? route.path.substring(1) : route.path;\n\n if (path == '*') {\n return new _MatchResult(route.component, [], null, [], []);\n }\n\n let parts = path.split('/');\n let positionalParams = {};\n let consumedUrlSegments: any[] /** TODO #9100 */ = [];\n\n let lastParent: TreeNode<UrlSegment> = null;\n let lastSegment: TreeNode<UrlSegment> = null;\n\n let current = url;\n for (let i = 0; i < parts.length; ++i) {\n if (isBlank(current)) return null;\n\n let p = parts[i];\n let isLastSegment = i === parts.length - 1;\n let isLastParent = i === parts.length - 2;\n let isPosParam = p.startsWith(':');\n\n if (!isPosParam && p != current.value.segment) return null;\n if (isLastSegment) {\n lastSegment = current;\n }\n if (isLastParent) {\n lastParent = current;\n }\n\n if (isPosParam) {\n (positionalParams as any /** TODO #9100 */)[p.substring(1)] = current.value.segment;\n }\n\n consumedUrlSegments.push(current.value);\n\n current = ListWrapper.first(current.children);\n }\n\n let p = lastSegment.value.parameters;\n let parameters = <{[key: string]: string}>StringMapWrapper.merge(p, positionalParams);\n let axuUrlSubtrees = isPresent(lastParent) ? lastParent.children.slice(1) : [];\n\n return new _MatchResult(\n route.component, consumedUrlSegments, parameters, lastSegment.children, axuUrlSubtrees);\n}\n\nfunction _checkOutletNameUniqueness(nodes: TreeNode<RouteSegment>[]): TreeNode<RouteSegment>[] {\n let names = {};\n nodes.forEach(n => {\n let segmentWithSameOutletName = (names as any /** TODO #9100 */)[n.value.outlet];\n if (isPresent(segmentWithSameOutletName)) {\n let p = segmentWithSameOutletName.stringifiedUrlSegments;\n let c = n.value.stringifiedUrlSegments;\n throw new BaseException(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`);\n }\n (names as any /** TODO #9100 */)[n.value.outlet] = n.value;\n });\n return nodes;\n}\n\nclass _MatchResult {\n constructor(\n public component: Type|string, public consumedUrlSegments: UrlSegment[],\n public parameters: {[key: string]: string}, public leftOverUrl: TreeNode<UrlSegment>[],\n public aux: TreeNode<UrlSegment>[]) {}\n\n get outlet(): string {\n return this.consumedUrlSegments.length === 0 || isBlank(this.consumedUrlSegments[0].outlet) ?\n DEFAULT_OUTLET_NAME :\n this.consumedUrlSegments[0].outlet;\n }\n}\n\nfunction _readMetadata(componentType: Type) {\n let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);\n return ListWrapper.first(metadata);\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
package/src/router.d.ts
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import { ComponentResolver } from '@angular/core';
|
|
2
1
|
import { RouterOutlet } from './directives/router_outlet';
|
|
3
|
-
import { Type } from './facade/lang';
|
|
4
2
|
import { Observable } from './facade/async';
|
|
5
|
-
import {
|
|
6
|
-
import { Location } from '@angular/common';
|
|
7
|
-
import { RouteSegment, UrlTree, RouteTree } from './segments';
|
|
8
|
-
/**
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
3
|
+
import { RouteSegment, RouteTree, UrlTree } from './segments';
|
|
11
4
|
export declare class RouterOutletMap {
|
|
12
|
-
/** @internal */
|
|
13
|
-
_outlets: {
|
|
14
|
-
[name: string]: RouterOutlet;
|
|
15
|
-
};
|
|
16
5
|
registerOutlet(name: string, outlet: RouterOutlet): void;
|
|
17
6
|
}
|
|
18
7
|
/**
|
|
@@ -28,14 +17,10 @@ export declare class Router {
|
|
|
28
17
|
private _urlSerializer;
|
|
29
18
|
private _routerOutletMap;
|
|
30
19
|
private _location;
|
|
31
|
-
private
|
|
20
|
+
private _routeTree;
|
|
32
21
|
private _urlTree;
|
|
33
22
|
private _locationSubscription;
|
|
34
23
|
private _changes;
|
|
35
|
-
/**
|
|
36
|
-
* @internal
|
|
37
|
-
*/
|
|
38
|
-
constructor(_rootComponent: Object, _rootComponentType: Type, _componentResolver: ComponentResolver, _urlSerializer: RouterUrlSerializer, _routerOutletMap: RouterOutletMap, _location: Location);
|
|
39
24
|
/**
|
|
40
25
|
* Returns the current url tree.
|
|
41
26
|
*/
|
|
@@ -69,10 +54,6 @@ export declare class Router {
|
|
|
69
54
|
* ```
|
|
70
55
|
*/
|
|
71
56
|
navigate(commands: any[], segment?: RouteSegment): Promise<void>;
|
|
72
|
-
/**
|
|
73
|
-
* @internal
|
|
74
|
-
*/
|
|
75
|
-
dispose(): void;
|
|
76
57
|
/**
|
|
77
58
|
* Applies an array of commands to the current url tree and creates
|
|
78
59
|
* a new url tree.
|
|
@@ -109,7 +90,6 @@ export declare class Router {
|
|
|
109
90
|
* Serializes a {@link UrlTree} into a string.
|
|
110
91
|
*/
|
|
111
92
|
serializeUrl(url: UrlTree): string;
|
|
112
|
-
private _createInitialTree();
|
|
113
93
|
private _setUpLocationChangeListener();
|
|
114
|
-
private _navigate(url);
|
|
94
|
+
private _navigate(url, preventPushState?);
|
|
115
95
|
}
|
package/src/router.js
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var core_1 = require('@angular/core');
|
|
3
|
-
var
|
|
4
|
-
var collection_1 = require('./facade/collection');
|
|
3
|
+
var constants_1 = require('./constants');
|
|
5
4
|
var async_1 = require('./facade/async');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
5
|
+
var collection_1 = require('./facade/collection');
|
|
6
|
+
var lang_1 = require('./facade/lang');
|
|
7
|
+
var lifecycle_reflector_1 = require('./lifecycle_reflector');
|
|
9
8
|
var link_1 = require('./link');
|
|
9
|
+
var recognize_1 = require('./recognize');
|
|
10
10
|
var segments_1 = require('./segments');
|
|
11
|
-
var lifecycle_reflector_1 = require('./lifecycle_reflector');
|
|
12
|
-
var constants_1 = require('./constants');
|
|
13
|
-
/**
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
11
|
var RouterOutletMap = (function () {
|
|
17
12
|
function RouterOutletMap() {
|
|
18
13
|
/** @internal */
|
|
@@ -40,7 +35,7 @@ var Router = (function () {
|
|
|
40
35
|
this._routerOutletMap = _routerOutletMap;
|
|
41
36
|
this._location = _location;
|
|
42
37
|
this._changes = new async_1.EventEmitter();
|
|
43
|
-
this.
|
|
38
|
+
this._routeTree = segments_1.createEmptyRouteTree(this._rootComponentType);
|
|
44
39
|
this._setUpLocationChangeListener();
|
|
45
40
|
this.navigateByUrl(this._location.path());
|
|
46
41
|
}
|
|
@@ -56,7 +51,7 @@ var Router = (function () {
|
|
|
56
51
|
/**
|
|
57
52
|
* Returns the current route tree.
|
|
58
53
|
*/
|
|
59
|
-
get: function () { return this.
|
|
54
|
+
get: function () { return this._routeTree; },
|
|
60
55
|
enumerable: true,
|
|
61
56
|
configurable: true
|
|
62
57
|
});
|
|
@@ -129,32 +124,36 @@ var Router = (function () {
|
|
|
129
124
|
* ```
|
|
130
125
|
*/
|
|
131
126
|
Router.prototype.createUrlTree = function (commands, segment) {
|
|
132
|
-
var s = lang_1.isPresent(segment) ? segment : this.
|
|
133
|
-
return link_1.link(s, this.
|
|
127
|
+
var s = lang_1.isPresent(segment) ? segment : this._routeTree.root;
|
|
128
|
+
return link_1.link(s, this._routeTree, this.urlTree, commands);
|
|
134
129
|
};
|
|
135
130
|
/**
|
|
136
131
|
* Serializes a {@link UrlTree} into a string.
|
|
137
132
|
*/
|
|
138
133
|
Router.prototype.serializeUrl = function (url) { return this._urlSerializer.serialize(url); };
|
|
139
|
-
Router.prototype._createInitialTree = function () {
|
|
140
|
-
var root = new segments_1.RouteSegment([new segments_1.UrlSegment("", {}, null)], {}, constants_1.DEFAULT_OUTLET_NAME, this._rootComponentType, null);
|
|
141
|
-
return new segments_1.RouteTree(new segments_1.TreeNode(root, []));
|
|
142
|
-
};
|
|
143
134
|
Router.prototype._setUpLocationChangeListener = function () {
|
|
144
135
|
var _this = this;
|
|
145
|
-
this._locationSubscription = this._location.subscribe(function (change) { _this._navigate(_this._urlSerializer.parse(change['url'])); });
|
|
136
|
+
this._locationSubscription = this._location.subscribe(function (change) { _this._navigate(_this._urlSerializer.parse(change['url']), change['pop']); });
|
|
146
137
|
};
|
|
147
|
-
Router.prototype._navigate = function (url) {
|
|
138
|
+
Router.prototype._navigate = function (url, preventPushState) {
|
|
148
139
|
var _this = this;
|
|
149
140
|
this._urlTree = url;
|
|
150
|
-
return recognize_1.recognize(this._componentResolver, this._rootComponentType, url)
|
|
141
|
+
return recognize_1.recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)
|
|
151
142
|
.then(function (currTree) {
|
|
152
|
-
return new
|
|
153
|
-
.
|
|
143
|
+
return new _ActivateSegments(currTree, _this._routeTree)
|
|
144
|
+
.activate(_this._routerOutletMap, _this._rootComponent)
|
|
154
145
|
.then(function (updated) {
|
|
155
146
|
if (updated) {
|
|
156
|
-
_this.
|
|
157
|
-
|
|
147
|
+
_this._routeTree = currTree;
|
|
148
|
+
if (lang_1.isBlank(preventPushState) || !preventPushState) {
|
|
149
|
+
var path = _this._urlSerializer.serialize(_this._urlTree);
|
|
150
|
+
if (_this._location.isCurrentPathEqualTo(path)) {
|
|
151
|
+
_this._location.replaceState(path);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
_this._location.go(path);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
158
157
|
_this._changes.emit(null);
|
|
159
158
|
}
|
|
160
159
|
});
|
|
@@ -163,39 +162,38 @@ var Router = (function () {
|
|
|
163
162
|
return Router;
|
|
164
163
|
}());
|
|
165
164
|
exports.Router = Router;
|
|
166
|
-
var
|
|
167
|
-
function
|
|
165
|
+
var _ActivateSegments = (function () {
|
|
166
|
+
function _ActivateSegments(currTree, prevTree) {
|
|
168
167
|
this.currTree = currTree;
|
|
169
168
|
this.prevTree = prevTree;
|
|
170
169
|
this.deactivations = [];
|
|
171
170
|
this.performMutation = true;
|
|
172
171
|
}
|
|
173
|
-
|
|
172
|
+
_ActivateSegments.prototype.activate = function (parentOutletMap, rootComponent) {
|
|
174
173
|
var _this = this;
|
|
175
174
|
var prevRoot = lang_1.isPresent(this.prevTree) ? segments_1.rootNode(this.prevTree) : null;
|
|
176
175
|
var currRoot = segments_1.rootNode(this.currTree);
|
|
177
|
-
return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)
|
|
178
|
-
.then(function (res) {
|
|
176
|
+
return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(function (res) {
|
|
179
177
|
_this.performMutation = true;
|
|
180
178
|
if (res) {
|
|
181
|
-
_this.
|
|
179
|
+
_this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
|
|
182
180
|
}
|
|
183
181
|
return res;
|
|
184
182
|
});
|
|
185
183
|
};
|
|
186
|
-
|
|
184
|
+
_ActivateSegments.prototype.canDeactivate = function (currRoot, prevRoot, outletMap, rootComponent) {
|
|
187
185
|
var _this = this;
|
|
188
186
|
this.performMutation = false;
|
|
189
|
-
this.
|
|
187
|
+
this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
|
|
190
188
|
var allPaths = async_1.PromiseWrapper.all(this.deactivations.map(function (r) { return _this.checkCanDeactivatePath(r); }));
|
|
191
189
|
return allPaths.then(function (values) { return values.filter(function (v) { return v; }).length === values.length; });
|
|
192
190
|
};
|
|
193
|
-
|
|
191
|
+
_ActivateSegments.prototype.checkCanDeactivatePath = function (path) {
|
|
194
192
|
var _this = this;
|
|
195
193
|
var curr = async_1.PromiseWrapper.resolve(true);
|
|
196
194
|
var _loop_1 = function(p) {
|
|
197
195
|
curr = curr.then(function (_) {
|
|
198
|
-
if (lifecycle_reflector_1.hasLifecycleHook(
|
|
196
|
+
if (lifecycle_reflector_1.hasLifecycleHook('routerCanDeactivate', p)) {
|
|
199
197
|
return p.routerCanDeactivate(_this.prevTree, _this.currTree);
|
|
200
198
|
}
|
|
201
199
|
else {
|
|
@@ -209,68 +207,70 @@ var _LoadSegments = (function () {
|
|
|
209
207
|
}
|
|
210
208
|
return curr;
|
|
211
209
|
};
|
|
212
|
-
|
|
210
|
+
_ActivateSegments.prototype.activateChildSegments = function (currNode, prevNode, outletMap, components) {
|
|
213
211
|
var _this = this;
|
|
214
|
-
var prevChildren = lang_1.isPresent(prevNode) ?
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}, {}) :
|
|
219
|
-
{};
|
|
212
|
+
var prevChildren = lang_1.isPresent(prevNode) ? prevNode.children.reduce(function (m, c) {
|
|
213
|
+
m[c.value.outlet] = c;
|
|
214
|
+
return m;
|
|
215
|
+
}, {}) : {};
|
|
220
216
|
currNode.children.forEach(function (c) {
|
|
221
|
-
_this.
|
|
222
|
-
|
|
217
|
+
_this.activateSegments(c, prevChildren[c.value.outlet], outletMap, components);
|
|
218
|
+
collection_1.StringMapWrapper.delete(prevChildren, c.value.outlet);
|
|
219
|
+
});
|
|
220
|
+
collection_1.StringMapWrapper.forEach(prevChildren, function (v /** TODO #9100 */, k /** TODO #9100 */) {
|
|
221
|
+
return _this.deactivateOutlet(outletMap._outlets[k], components);
|
|
223
222
|
});
|
|
224
|
-
collection_2.StringMapWrapper.forEach(prevChildren, function (v, k) { return _this.unloadOutlet(outletMap._outlets[k], components); });
|
|
225
223
|
};
|
|
226
|
-
|
|
224
|
+
_ActivateSegments.prototype.activateSegments = function (currNode, prevNode, parentOutletMap, components) {
|
|
227
225
|
var curr = currNode.value;
|
|
228
226
|
var prev = lang_1.isPresent(prevNode) ? prevNode.value : null;
|
|
229
227
|
var outlet = this.getOutlet(parentOutletMap, currNode.value);
|
|
230
|
-
if (
|
|
231
|
-
this.
|
|
228
|
+
if (curr === prev) {
|
|
229
|
+
this.activateChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));
|
|
232
230
|
}
|
|
233
231
|
else {
|
|
234
|
-
this.
|
|
232
|
+
this.deactivateOutlet(outlet, components);
|
|
235
233
|
if (this.performMutation) {
|
|
236
234
|
var outletMap = new RouterOutletMap();
|
|
237
|
-
var
|
|
238
|
-
this.
|
|
235
|
+
var component = this.activateNewSegments(outletMap, curr, prev, outlet);
|
|
236
|
+
this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));
|
|
239
237
|
}
|
|
240
238
|
}
|
|
241
239
|
};
|
|
242
|
-
|
|
243
|
-
var resolved = core_1.ReflectiveInjector.resolve([
|
|
244
|
-
var ref = outlet.
|
|
245
|
-
if (lifecycle_reflector_1.hasLifecycleHook(
|
|
240
|
+
_ActivateSegments.prototype.activateNewSegments = function (outletMap, curr, prev, outlet) {
|
|
241
|
+
var resolved = core_1.ReflectiveInjector.resolve([{ provide: RouterOutletMap, useValue: outletMap }, { provide: segments_1.RouteSegment, useValue: curr }]);
|
|
242
|
+
var ref = outlet.activate(segments_1.routeSegmentComponentFactory(curr), resolved, outletMap);
|
|
243
|
+
if (lifecycle_reflector_1.hasLifecycleHook('routerOnActivate', ref.instance)) {
|
|
246
244
|
ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);
|
|
247
245
|
}
|
|
248
246
|
return ref.instance;
|
|
249
247
|
};
|
|
250
|
-
|
|
248
|
+
_ActivateSegments.prototype.getOutlet = function (outletMap, segment) {
|
|
251
249
|
var outlet = outletMap._outlets[segment.outlet];
|
|
252
250
|
if (lang_1.isBlank(outlet)) {
|
|
253
251
|
if (segment.outlet == constants_1.DEFAULT_OUTLET_NAME) {
|
|
254
|
-
throw new
|
|
252
|
+
throw new core_1.BaseException("Cannot find default outlet");
|
|
255
253
|
}
|
|
256
254
|
else {
|
|
257
|
-
throw new
|
|
255
|
+
throw new core_1.BaseException("Cannot find the outlet " + segment.outlet);
|
|
258
256
|
}
|
|
259
257
|
}
|
|
260
258
|
return outlet;
|
|
261
259
|
};
|
|
262
|
-
|
|
260
|
+
_ActivateSegments.prototype.deactivateOutlet = function (outlet, components) {
|
|
263
261
|
var _this = this;
|
|
264
|
-
if (lang_1.isPresent(outlet) && outlet.
|
|
265
|
-
|
|
262
|
+
if (lang_1.isPresent(outlet) && outlet.isActivated) {
|
|
263
|
+
collection_1.StringMapWrapper.forEach(outlet.outletMap._outlets, function (v /** TODO #9100 */, k /** TODO #9100 */) {
|
|
264
|
+
return _this.deactivateOutlet(v, components);
|
|
265
|
+
});
|
|
266
266
|
if (this.performMutation) {
|
|
267
|
-
outlet.
|
|
267
|
+
outlet.deactivate();
|
|
268
268
|
}
|
|
269
269
|
else {
|
|
270
|
-
this.deactivations.push(components.concat([outlet.
|
|
270
|
+
this.deactivations.push(components.concat([outlet.component]));
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
273
|
};
|
|
274
|
-
return
|
|
274
|
+
return _ActivateSegments;
|
|
275
275
|
}());
|
|
276
276
|
//# sourceMappingURL=router.js.map
|