@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/esm/src/recognize.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { RouteSegment, TreeNode, rootNode, RouteTree } from './segments';
|
|
2
|
-
import { RoutesMetadata } from './metadata/metadata';
|
|
3
|
-
import { isBlank, isPresent, stringify } from './facade/lang';
|
|
4
|
-
import { ListWrapper, StringMapWrapper } from './facade/collection';
|
|
5
|
-
import { PromiseWrapper } from './facade/promise';
|
|
6
1
|
import { BaseException } from '@angular/core';
|
|
7
2
|
import { DEFAULT_OUTLET_NAME } from './constants';
|
|
8
|
-
import { reflector } from '
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
import { reflector } from './core_private';
|
|
4
|
+
import { ListWrapper, StringMapWrapper } from './facade/collection';
|
|
5
|
+
import { isBlank, isPresent, stringify } from './facade/lang';
|
|
6
|
+
import { PromiseWrapper } from './facade/promise';
|
|
7
|
+
import { RoutesMetadata } from './metadata/metadata';
|
|
8
|
+
import { RouteSegment, RouteTree, TreeNode, equalUrlSegments, rootNode } from './segments';
|
|
9
|
+
export function recognize(componentResolver, rootComponent, url, existingTree) {
|
|
10
|
+
let matched = new _MatchResult(rootComponent, [url.root], {}, rootNode(url).children, []);
|
|
11
|
+
return _constructSegment(componentResolver, matched, rootNode(existingTree))
|
|
12
|
+
.then(roots => new RouteTree(roots[0]));
|
|
13
13
|
}
|
|
14
|
-
function _recognize(componentResolver,
|
|
15
|
-
let metadata = _readMetadata(
|
|
14
|
+
function _recognize(componentResolver, parentComponent, url, existingSegments) {
|
|
15
|
+
let metadata = _readMetadata(parentComponent); // should read from the factory instead
|
|
16
16
|
if (isBlank(metadata)) {
|
|
17
|
-
throw new BaseException(`Component '${stringify(
|
|
17
|
+
throw new BaseException(`Component '${stringify(parentComponent)}' does not have route configuration`);
|
|
18
18
|
}
|
|
19
19
|
let match;
|
|
20
20
|
try {
|
|
@@ -23,49 +23,60 @@ function _recognize(componentResolver, parentType, url) {
|
|
|
23
23
|
catch (e) {
|
|
24
24
|
return PromiseWrapper.reject(e, null);
|
|
25
25
|
}
|
|
26
|
-
let
|
|
27
|
-
let
|
|
26
|
+
let segmentsWithRightOutlet = existingSegments.filter(r => r.value.outlet == match.outlet);
|
|
27
|
+
let segmentWithRightOutlet = segmentsWithRightOutlet.length > 0 ? segmentsWithRightOutlet[0] : null;
|
|
28
|
+
let main = _constructSegment(componentResolver, match, segmentWithRightOutlet);
|
|
29
|
+
let aux = _recognizeMany(componentResolver, parentComponent, match.aux, existingSegments)
|
|
30
|
+
.then(_checkOutletNameUniqueness);
|
|
28
31
|
return PromiseWrapper.all([main, aux]).then(ListWrapper.flatten);
|
|
29
32
|
}
|
|
30
|
-
function _recognizeMany(componentResolver,
|
|
31
|
-
let recognized = urls.map(u => _recognize(componentResolver,
|
|
33
|
+
function _recognizeMany(componentResolver, parentComponent, urls, existingSegments) {
|
|
34
|
+
let recognized = urls.map(u => _recognize(componentResolver, parentComponent, u, existingSegments));
|
|
32
35
|
return PromiseWrapper.all(recognized).then(ListWrapper.flatten);
|
|
33
36
|
}
|
|
34
|
-
function _constructSegment(componentResolver, matched) {
|
|
35
|
-
return componentResolver.resolveComponent(matched.component)
|
|
36
|
-
|
|
37
|
-
let
|
|
38
|
-
isBlank(matched.consumedUrlSegments[0].outlet) ?
|
|
39
|
-
DEFAULT_OUTLET_NAME :
|
|
40
|
-
matched.consumedUrlSegments[0].outlet;
|
|
41
|
-
let segment = new RouteSegment(matched.consumedUrlSegments, matched.parameters, urlOutlet, matched.component, factory);
|
|
37
|
+
function _constructSegment(componentResolver, matched, existingSegment) {
|
|
38
|
+
return componentResolver.resolveComponent(matched.component).then(factory => {
|
|
39
|
+
let segment = _createOrReuseSegment(matched, factory, existingSegment);
|
|
40
|
+
let existingChildren = isPresent(existingSegment) ? existingSegment.children : [];
|
|
42
41
|
if (matched.leftOverUrl.length > 0) {
|
|
43
|
-
return _recognizeMany(componentResolver,
|
|
42
|
+
return _recognizeMany(componentResolver, factory.componentType, matched.leftOverUrl, existingChildren)
|
|
44
43
|
.then(children => [new TreeNode(segment, children)]);
|
|
45
44
|
}
|
|
46
45
|
else {
|
|
47
|
-
return _recognizeLeftOvers(componentResolver,
|
|
46
|
+
return _recognizeLeftOvers(componentResolver, factory.componentType, existingChildren)
|
|
48
47
|
.then(children => [new TreeNode(segment, children)]);
|
|
49
48
|
}
|
|
50
49
|
});
|
|
51
50
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
function _createOrReuseSegment(matched, factory, segmentNode) {
|
|
52
|
+
let segment = isPresent(segmentNode) ? segmentNode.value : null;
|
|
53
|
+
if (isPresent(segment) && equalUrlSegments(segment.urlSegments, matched.consumedUrlSegments) &&
|
|
54
|
+
StringMapWrapper.equals(segment.parameters, matched.parameters) &&
|
|
55
|
+
segment.outlet == matched.outlet && factory.componentType == segment.type) {
|
|
56
|
+
return segment;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return new RouteSegment(matched.consumedUrlSegments, matched.parameters, matched.outlet, factory.componentType, factory);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function _recognizeLeftOvers(componentResolver, parentComponent, existingSegments) {
|
|
63
|
+
return componentResolver.resolveComponent(parentComponent).then(factory => {
|
|
64
|
+
let metadata = _readMetadata(factory.componentType);
|
|
56
65
|
if (isBlank(metadata)) {
|
|
57
66
|
return [];
|
|
58
67
|
}
|
|
59
|
-
let r = metadata.routes.filter(r => r.path ==
|
|
68
|
+
let r = metadata.routes.filter(r => r.path == '' || r.path == '/');
|
|
60
69
|
if (r.length === 0) {
|
|
61
70
|
return PromiseWrapper.resolve([]);
|
|
62
71
|
}
|
|
63
72
|
else {
|
|
64
|
-
|
|
73
|
+
let segmentsWithMatchingOutlet = existingSegments.filter(r => r.value.outlet == DEFAULT_OUTLET_NAME);
|
|
74
|
+
let segmentWithMatchingOutlet = segmentsWithMatchingOutlet.length > 0 ? segmentsWithMatchingOutlet[0] : null;
|
|
75
|
+
let existingChildren = isPresent(segmentWithMatchingOutlet) ? segmentWithMatchingOutlet.children : [];
|
|
76
|
+
return _recognizeLeftOvers(componentResolver, r[0].component, existingChildren)
|
|
65
77
|
.then(children => {
|
|
66
|
-
return componentResolver.resolveComponent(r[0].component)
|
|
67
|
-
|
|
68
|
-
let segment = new RouteSegment([], {}, DEFAULT_OUTLET_NAME, r[0].component, factory);
|
|
78
|
+
return componentResolver.resolveComponent(r[0].component).then(factory => {
|
|
79
|
+
let segment = _createOrReuseSegment(new _MatchResult(r[0].component, [], {}, [], []), factory, segmentWithMatchingOutlet);
|
|
69
80
|
return [new TreeNode(segment, children)];
|
|
70
81
|
});
|
|
71
82
|
});
|
|
@@ -79,15 +90,15 @@ function _match(metadata, url) {
|
|
|
79
90
|
return matchingResult;
|
|
80
91
|
}
|
|
81
92
|
}
|
|
82
|
-
let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(
|
|
93
|
+
let availableRoutes = metadata.routes.map(r => `'${r.path}'`).join(', ');
|
|
83
94
|
throw new BaseException(`Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`);
|
|
84
95
|
}
|
|
85
96
|
function _matchWithParts(route, url) {
|
|
86
|
-
let path = route.path.startsWith(
|
|
87
|
-
if (path ==
|
|
97
|
+
let path = route.path.startsWith('/') ? route.path.substring(1) : route.path;
|
|
98
|
+
if (path == '*') {
|
|
88
99
|
return new _MatchResult(route.component, [], null, [], []);
|
|
89
100
|
}
|
|
90
|
-
let parts = path.split(
|
|
101
|
+
let parts = path.split('/');
|
|
91
102
|
let positionalParams = {};
|
|
92
103
|
let consumedUrlSegments = [];
|
|
93
104
|
let lastParent = null;
|
|
@@ -99,7 +110,7 @@ function _matchWithParts(route, url) {
|
|
|
99
110
|
let p = parts[i];
|
|
100
111
|
let isLastSegment = i === parts.length - 1;
|
|
101
112
|
let isLastParent = i === parts.length - 2;
|
|
102
|
-
let isPosParam = p.startsWith(
|
|
113
|
+
let isPosParam = p.startsWith(':');
|
|
103
114
|
if (!isPosParam && p != current.value.segment)
|
|
104
115
|
return null;
|
|
105
116
|
if (isLastSegment) {
|
|
@@ -140,6 +151,11 @@ class _MatchResult {
|
|
|
140
151
|
this.leftOverUrl = leftOverUrl;
|
|
141
152
|
this.aux = aux;
|
|
142
153
|
}
|
|
154
|
+
get outlet() {
|
|
155
|
+
return this.consumedUrlSegments.length === 0 || isBlank(this.consumedUrlSegments[0].outlet) ?
|
|
156
|
+
DEFAULT_OUTLET_NAME :
|
|
157
|
+
this.consumedUrlSegments[0].outlet;
|
|
158
|
+
}
|
|
143
159
|
}
|
|
144
160
|
function _readMetadata(componentType) {
|
|
145
161
|
let metadata = reflector.annotations(componentType).filter(f => f instanceof RoutesMetadata);
|
package/esm/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/esm/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/esm/src/router.js
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseException, ReflectiveInjector } from '@angular/core';
|
|
2
|
+
import { DEFAULT_OUTLET_NAME } from './constants';
|
|
3
|
+
import { EventEmitter, ObservableWrapper, PromiseWrapper } from './facade/async';
|
|
4
|
+
import { ListWrapper, StringMapWrapper } from './facade/collection';
|
|
2
5
|
import { isBlank, isPresent } from './facade/lang';
|
|
3
|
-
import { ListWrapper } from './facade/collection';
|
|
4
|
-
import { EventEmitter, PromiseWrapper, ObservableWrapper } from './facade/async';
|
|
5
|
-
import { StringMapWrapper } from './facade/collection';
|
|
6
|
-
import { BaseException } from '@angular/core';
|
|
7
|
-
import { recognize } from './recognize';
|
|
8
|
-
import { link } from './link';
|
|
9
|
-
import { equalSegments, routeSegmentComponentFactory, RouteSegment, RouteTree, rootNode, TreeNode, UrlSegment } from './segments';
|
|
10
6
|
import { hasLifecycleHook } from './lifecycle_reflector';
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*/
|
|
7
|
+
import { link } from './link';
|
|
8
|
+
import { recognize } from './recognize';
|
|
9
|
+
import { RouteSegment, createEmptyRouteTree, rootNode, routeSegmentComponentFactory } from './segments';
|
|
15
10
|
export class RouterOutletMap {
|
|
16
11
|
constructor() {
|
|
17
12
|
/** @internal */
|
|
@@ -37,7 +32,7 @@ export class Router {
|
|
|
37
32
|
this._routerOutletMap = _routerOutletMap;
|
|
38
33
|
this._location = _location;
|
|
39
34
|
this._changes = new EventEmitter();
|
|
40
|
-
this.
|
|
35
|
+
this._routeTree = createEmptyRouteTree(this._rootComponentType);
|
|
41
36
|
this._setUpLocationChangeListener();
|
|
42
37
|
this.navigateByUrl(this._location.path());
|
|
43
38
|
}
|
|
@@ -48,7 +43,7 @@ export class Router {
|
|
|
48
43
|
/**
|
|
49
44
|
* Returns the current route tree.
|
|
50
45
|
*/
|
|
51
|
-
get routeTree() { return this.
|
|
46
|
+
get routeTree() { return this._routeTree; }
|
|
52
47
|
/**
|
|
53
48
|
* An observable or url changes from the router.
|
|
54
49
|
*/
|
|
@@ -114,58 +109,61 @@ export class Router {
|
|
|
114
109
|
* ```
|
|
115
110
|
*/
|
|
116
111
|
createUrlTree(commands, segment) {
|
|
117
|
-
let s = isPresent(segment) ? segment : this.
|
|
118
|
-
return link(s, this.
|
|
112
|
+
let s = isPresent(segment) ? segment : this._routeTree.root;
|
|
113
|
+
return link(s, this._routeTree, this.urlTree, commands);
|
|
119
114
|
}
|
|
120
115
|
/**
|
|
121
116
|
* Serializes a {@link UrlTree} into a string.
|
|
122
117
|
*/
|
|
123
118
|
serializeUrl(url) { return this._urlSerializer.serialize(url); }
|
|
124
|
-
_createInitialTree() {
|
|
125
|
-
let root = new RouteSegment([new UrlSegment("", {}, null)], {}, DEFAULT_OUTLET_NAME, this._rootComponentType, null);
|
|
126
|
-
return new RouteTree(new TreeNode(root, []));
|
|
127
|
-
}
|
|
128
119
|
_setUpLocationChangeListener() {
|
|
129
|
-
this._locationSubscription = this._location.subscribe((change) => { this._navigate(this._urlSerializer.parse(change['url'])); });
|
|
120
|
+
this._locationSubscription = this._location.subscribe((change) => { this._navigate(this._urlSerializer.parse(change['url']), change['pop']); });
|
|
130
121
|
}
|
|
131
|
-
_navigate(url) {
|
|
122
|
+
_navigate(url, preventPushState) {
|
|
132
123
|
this._urlTree = url;
|
|
133
|
-
return recognize(this._componentResolver, this._rootComponentType, url)
|
|
124
|
+
return recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)
|
|
134
125
|
.then(currTree => {
|
|
135
|
-
return new
|
|
136
|
-
.
|
|
126
|
+
return new _ActivateSegments(currTree, this._routeTree)
|
|
127
|
+
.activate(this._routerOutletMap, this._rootComponent)
|
|
137
128
|
.then(updated => {
|
|
138
129
|
if (updated) {
|
|
139
|
-
this.
|
|
140
|
-
|
|
130
|
+
this._routeTree = currTree;
|
|
131
|
+
if (isBlank(preventPushState) || !preventPushState) {
|
|
132
|
+
let path = this._urlSerializer.serialize(this._urlTree);
|
|
133
|
+
if (this._location.isCurrentPathEqualTo(path)) {
|
|
134
|
+
this._location.replaceState(path);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this._location.go(path);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
141
140
|
this._changes.emit(null);
|
|
142
141
|
}
|
|
143
142
|
});
|
|
144
143
|
});
|
|
145
144
|
}
|
|
146
145
|
}
|
|
147
|
-
class
|
|
146
|
+
class _ActivateSegments {
|
|
148
147
|
constructor(currTree, prevTree) {
|
|
149
148
|
this.currTree = currTree;
|
|
150
149
|
this.prevTree = prevTree;
|
|
151
150
|
this.deactivations = [];
|
|
152
151
|
this.performMutation = true;
|
|
153
152
|
}
|
|
154
|
-
|
|
153
|
+
activate(parentOutletMap, rootComponent) {
|
|
155
154
|
let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;
|
|
156
155
|
let currRoot = rootNode(this.currTree);
|
|
157
|
-
return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)
|
|
158
|
-
.then(res => {
|
|
156
|
+
return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(res => {
|
|
159
157
|
this.performMutation = true;
|
|
160
158
|
if (res) {
|
|
161
|
-
this.
|
|
159
|
+
this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);
|
|
162
160
|
}
|
|
163
161
|
return res;
|
|
164
162
|
});
|
|
165
163
|
}
|
|
166
164
|
canDeactivate(currRoot, prevRoot, outletMap, rootComponent) {
|
|
167
165
|
this.performMutation = false;
|
|
168
|
-
this.
|
|
166
|
+
this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);
|
|
169
167
|
let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));
|
|
170
168
|
return allPaths.then((values) => values.filter(v => v).length === values.length);
|
|
171
169
|
}
|
|
@@ -173,7 +171,7 @@ class _LoadSegments {
|
|
|
173
171
|
let curr = PromiseWrapper.resolve(true);
|
|
174
172
|
for (let p of ListWrapper.reversed(path)) {
|
|
175
173
|
curr = curr.then(_ => {
|
|
176
|
-
if (hasLifecycleHook(
|
|
174
|
+
if (hasLifecycleHook('routerCanDeactivate', p)) {
|
|
177
175
|
return p.routerCanDeactivate(this.prevTree, this.currTree);
|
|
178
176
|
}
|
|
179
177
|
else {
|
|
@@ -183,39 +181,37 @@ class _LoadSegments {
|
|
|
183
181
|
}
|
|
184
182
|
return curr;
|
|
185
183
|
}
|
|
186
|
-
|
|
187
|
-
let prevChildren = isPresent(prevNode) ?
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}, {}) :
|
|
192
|
-
{};
|
|
184
|
+
activateChildSegments(currNode, prevNode, outletMap, components) {
|
|
185
|
+
let prevChildren = isPresent(prevNode) ? prevNode.children.reduce((m, c) => {
|
|
186
|
+
m[c.value.outlet] = c;
|
|
187
|
+
return m;
|
|
188
|
+
}, {}) : {};
|
|
193
189
|
currNode.children.forEach(c => {
|
|
194
|
-
this.
|
|
190
|
+
this.activateSegments(c, prevChildren[c.value.outlet], outletMap, components);
|
|
195
191
|
StringMapWrapper.delete(prevChildren, c.value.outlet);
|
|
196
192
|
});
|
|
197
|
-
StringMapWrapper.forEach(prevChildren, (v
|
|
193
|
+
StringMapWrapper.forEach(prevChildren, (v /** TODO #9100 */, k /** TODO #9100 */) => this.deactivateOutlet(outletMap._outlets[k], components));
|
|
198
194
|
}
|
|
199
|
-
|
|
195
|
+
activateSegments(currNode, prevNode, parentOutletMap, components) {
|
|
200
196
|
let curr = currNode.value;
|
|
201
197
|
let prev = isPresent(prevNode) ? prevNode.value : null;
|
|
202
198
|
let outlet = this.getOutlet(parentOutletMap, currNode.value);
|
|
203
|
-
if (
|
|
204
|
-
this.
|
|
199
|
+
if (curr === prev) {
|
|
200
|
+
this.activateChildSegments(currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));
|
|
205
201
|
}
|
|
206
202
|
else {
|
|
207
|
-
this.
|
|
203
|
+
this.deactivateOutlet(outlet, components);
|
|
208
204
|
if (this.performMutation) {
|
|
209
205
|
let outletMap = new RouterOutletMap();
|
|
210
|
-
let
|
|
211
|
-
this.
|
|
206
|
+
let component = this.activateNewSegments(outletMap, curr, prev, outlet);
|
|
207
|
+
this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));
|
|
212
208
|
}
|
|
213
209
|
}
|
|
214
210
|
}
|
|
215
|
-
|
|
216
|
-
let resolved = ReflectiveInjector.resolve([provide
|
|
217
|
-
let ref = outlet.
|
|
218
|
-
if (hasLifecycleHook(
|
|
211
|
+
activateNewSegments(outletMap, curr, prev, outlet) {
|
|
212
|
+
let resolved = ReflectiveInjector.resolve([{ provide: RouterOutletMap, useValue: outletMap }, { provide: RouteSegment, useValue: curr }]);
|
|
213
|
+
let ref = outlet.activate(routeSegmentComponentFactory(curr), resolved, outletMap);
|
|
214
|
+
if (hasLifecycleHook('routerOnActivate', ref.instance)) {
|
|
219
215
|
ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);
|
|
220
216
|
}
|
|
221
217
|
return ref.instance;
|
|
@@ -232,14 +228,14 @@ class _LoadSegments {
|
|
|
232
228
|
}
|
|
233
229
|
return outlet;
|
|
234
230
|
}
|
|
235
|
-
|
|
236
|
-
if (isPresent(outlet) && outlet.
|
|
237
|
-
StringMapWrapper.forEach(outlet.outletMap._outlets, (v
|
|
231
|
+
deactivateOutlet(outlet, components) {
|
|
232
|
+
if (isPresent(outlet) && outlet.isActivated) {
|
|
233
|
+
StringMapWrapper.forEach(outlet.outletMap._outlets, (v /** TODO #9100 */, k /** TODO #9100 */) => this.deactivateOutlet(v, components));
|
|
238
234
|
if (this.performMutation) {
|
|
239
|
-
outlet.
|
|
235
|
+
outlet.deactivate();
|
|
240
236
|
}
|
|
241
237
|
else {
|
|
242
|
-
this.deactivations.push(components.concat([outlet.
|
|
238
|
+
this.deactivations.push(components.concat([outlet.component]));
|
|
243
239
|
}
|
|
244
240
|
}
|
|
245
241
|
}
|
package/esm/src/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/router.ts"],"names":[],"mappings":"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","sourcesContent":["interface DecoratorInvocation {\n type: Function;\n args?: any[];\n }\n import {OnInit, provide, ReflectiveInjector, ComponentResolver} from '@angular/core';\nimport {RouterOutlet} from './directives/router_outlet';\nimport {Type, isBlank, isPresent} from './facade/lang';\nimport {ListWrapper} from './facade/collection';\nimport {EventEmitter, Observable, PromiseWrapper, ObservableWrapper} from './facade/async';\nimport {StringMapWrapper} from './facade/collection';\nimport {BaseException} from '@angular/core';\nimport {RouterUrlSerializer} from './router_url_serializer';\nimport {CanDeactivate} from './interfaces';\nimport {recognize} from './recognize';\nimport {Location} from '@angular/common';\nimport {link} from './link';\n\nimport {\n equalSegments,\n routeSegmentComponentFactory,\n RouteSegment,\n UrlTree,\n RouteTree,\n rootNode,\n TreeNode,\n UrlSegment,\n serializeRouteSegmentTree\n} from './segments';\nimport {hasLifecycleHook} from './lifecycle_reflector';\nimport {DEFAULT_OUTLET_NAME} from './constants';\n\n/**\n * @internal\n */\nexport class RouterOutletMap {\n /** @internal */\n _outlets: {[name: string]: RouterOutlet} = {};\n registerOutlet(name: string, outlet: RouterOutlet): void { this._outlets[name] = outlet; }\n}\n\n/**\n * The `Router` is responsible for mapping URLs to components.\n *\n * You can see the state of the router by inspecting the read-only fields `router.urlTree`\n * and `router.routeTree`.\n */\nexport class Router {\n private _prevTree: RouteTree;\n private _urlTree: UrlTree;\n private _locationSubscription: any;\n private _changes: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * @internal\n */\n constructor(private _rootComponent: Object, private _rootComponentType: Type,\n private _componentResolver: ComponentResolver,\n private _urlSerializer: RouterUrlSerializer,\n private _routerOutletMap: RouterOutletMap, private _location: Location) {\n this._prevTree = this._createInitialTree();\n this._setUpLocationChangeListener();\n this.navigateByUrl(this._location.path());\n }\n\n /**\n * Returns the current url tree.\n */\n get urlTree(): UrlTree { return this._urlTree; }\n\n /**\n * Returns the current route tree.\n */\n get routeTree(): RouteTree { return this._prevTree; }\n\n /**\n * An observable or url changes from the router.\n */\n get changes(): Observable<void> { return this._changes; }\n\n /**\n * Navigate based on the provided url. This navigation is always absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigateByUrl(\"/team/33/user/11\");\n * ```\n */\n navigateByUrl(url: string): Promise<void> {\n return this._navigate(this._urlSerializer.parse(url));\n }\n\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no segment is provided, the navigation is absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigate(['team', 33, 'team', '11], segment);\n * ```\n */\n navigate(commands: any[], segment?: RouteSegment): Promise<void> {\n return this._navigate(this.createUrlTree(commands, segment));\n }\n\n /**\n * @internal\n */\n dispose(): void { ObservableWrapper.dispose(this._locationSubscription); }\n\n /**\n * Applies an array of commands to the current url tree and creates\n * a new url tree.\n *\n * When given a segment, applies the given commands starting from the segment.\n * When not given a segment, applies the given command starting from the root.\n *\n * ### Usage\n *\n * ```\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static fragments like this\n * router.createUrlTree(['/team/33/user', userId]);\n *\n * // assuming the current url is `/team/33/user/11` and the segment points to `user/11`\n *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], segment);\n *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], segment);\n *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], segment);\n * ```\n */\n createUrlTree(commands: any[], segment?: RouteSegment): UrlTree {\n let s = isPresent(segment) ? segment : this._prevTree.root;\n return link(s, this._prevTree, this.urlTree, commands);\n }\n\n /**\n * Serializes a {@link UrlTree} into a string.\n */\n serializeUrl(url: UrlTree): string { return this._urlSerializer.serialize(url); }\n\n private _createInitialTree(): RouteTree {\n let root = new RouteSegment([new UrlSegment(\"\", {}, null)], {}, DEFAULT_OUTLET_NAME,\n this._rootComponentType, null);\n return new RouteTree(new TreeNode<RouteSegment>(root, []));\n }\n\n private _setUpLocationChangeListener(): void {\n this._locationSubscription = this._location.subscribe(\n (change) => { this._navigate(this._urlSerializer.parse(change['url'])); });\n }\n\n private _navigate(url: UrlTree): Promise<void> {\n this._urlTree = url;\n return recognize(this._componentResolver, this._rootComponentType, url)\n .then(currTree => {\n return new _LoadSegments(currTree, this._prevTree)\n .load(this._routerOutletMap, this._rootComponent)\n .then(updated => {\n if (updated) {\n this._prevTree = currTree;\n this._location.go(this._urlSerializer.serialize(this._urlTree));\n this._changes.emit(null);\n }\n });\n });\n }\n}\n\n\nclass _LoadSegments {\n private deactivations: Object[][] = [];\n private performMutation: boolean = true;\n\n constructor(private currTree: RouteTree, private prevTree: RouteTree) {}\n\n load(parentOutletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;\n let currRoot = rootNode(this.currTree);\n\n return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent)\n .then(res => {\n this.performMutation = true;\n if (res) {\n this.loadChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);\n }\n return res;\n });\n }\n\n private canDeactivate(currRoot: TreeNode<RouteSegment>, prevRoot: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n this.performMutation = false;\n this.loadChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);\n\n let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));\n return allPaths.then((values: boolean[]) => values.filter(v => v).length === values.length);\n }\n\n private checkCanDeactivatePath(path: Object[]): Promise<boolean> {\n let curr = PromiseWrapper.resolve(true);\n for (let p of ListWrapper.reversed(path)) {\n curr = curr.then(_ => {\n if (hasLifecycleHook(\"routerCanDeactivate\", p)) {\n return (<CanDeactivate>p).routerCanDeactivate(this.prevTree, this.currTree);\n } else {\n return _;\n }\n });\n }\n return curr;\n }\n\n private loadChildSegments(currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, components: Object[]): void {\n let prevChildren = isPresent(prevNode) ?\n prevNode.children.reduce(\n (m, c) => {\n m[c.value.outlet] = c;\n return m;\n },\n {}) :\n {};\n\n currNode.children.forEach(c => {\n this.loadSegments(c, prevChildren[c.value.outlet], outletMap, components);\n StringMapWrapper.delete(prevChildren, c.value.outlet);\n });\n\n StringMapWrapper.forEach(prevChildren,\n (v, k) => this.unloadOutlet(outletMap._outlets[k], components));\n }\n\n loadSegments(currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n parentOutletMap: RouterOutletMap, components: Object[]): void {\n let curr = currNode.value;\n let prev = isPresent(prevNode) ? prevNode.value : null;\n let outlet = this.getOutlet(parentOutletMap, currNode.value);\n\n if (equalSegments(curr, prev)) {\n this.loadChildSegments(currNode, prevNode, outlet.outletMap,\n components.concat([outlet.loadedComponent]));\n } else {\n this.unloadOutlet(outlet, components);\n if (this.performMutation) {\n let outletMap = new RouterOutletMap();\n let loadedComponent = this.loadNewSegment(outletMap, curr, prev, outlet);\n this.loadChildSegments(currNode, prevNode, outletMap, components.concat([loadedComponent]));\n }\n }\n }\n\n private loadNewSegment(outletMap: RouterOutletMap, curr: RouteSegment, prev: RouteSegment,\n outlet: RouterOutlet): Object {\n let resolved = ReflectiveInjector.resolve(\n [provide(RouterOutletMap, {useValue: outletMap}), provide(RouteSegment, {useValue: curr})]);\n let ref = outlet.load(routeSegmentComponentFactory(curr), resolved, outletMap);\n if (hasLifecycleHook(\"routerOnActivate\", ref.instance)) {\n ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);\n }\n return ref.instance;\n }\n\n private getOutlet(outletMap: RouterOutletMap, segment: RouteSegment): RouterOutlet {\n let outlet = outletMap._outlets[segment.outlet];\n if (isBlank(outlet)) {\n if (segment.outlet == DEFAULT_OUTLET_NAME) {\n throw new BaseException(`Cannot find default outlet`);\n } else {\n throw new BaseException(`Cannot find the outlet ${segment.outlet}`);\n }\n }\n return outlet;\n }\n\n private unloadOutlet(outlet: RouterOutlet, components: Object[]): void {\n if (isPresent(outlet) && outlet.isLoaded) {\n StringMapWrapper.forEach(outlet.outletMap._outlets,\n (v, k) => this.unloadOutlet(v, components));\n if (this.performMutation) {\n outlet.unload();\n } else {\n this.deactivations.push(components.concat([outlet.loadedComponent]));\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../../modules/@angular/router/src/router.ts"],"names":[],"mappings":"OACO,EAAC,aAAa,EAAqB,kBAAkB,EAAU,MAAM,eAAe;OAEpF,EAAC,mBAAmB,EAAC,MAAM,aAAa;OAExC,EAAC,YAAY,EAAc,iBAAiB,EAAE,cAAc,EAAC,MAAM,gBAAgB;OACnF,EAAC,WAAW,EAAE,gBAAgB,EAAC,MAAM,qBAAqB;OAC1D,EAAO,OAAO,EAAE,SAAS,EAAC,MAAM,eAAe;OAE/C,EAAC,gBAAgB,EAAC,MAAM,uBAAuB;OAC/C,EAAC,IAAI,EAAC,MAAM,QAAQ;OACpB,EAAC,SAAS,EAAC,MAAM,aAAa;OAE9B,EAAC,YAAY,EAA4C,oBAAoB,EAAE,QAAQ,EAAE,4BAA4B,EAA4B,MAAM,YAAY;AAE1K;IAAA;QACE,gBAAgB;QAChB,aAAQ,GAAmC,EAAE,CAAC;IAEhD,CAAC;IADC,cAAc,CAAC,IAAY,EAAE,MAAoB,IAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED;;;;;GAKG;AACH;IAME;;OAEG;IACH,YACY,cAAsB,EAAU,kBAAwB,EACxD,kBAAqC,EAAU,cAAmC,EAClF,gBAAiC,EAAU,SAAmB;QAF9D,mBAAc,GAAd,cAAc,CAAQ;QAAU,uBAAkB,GAAlB,kBAAkB,CAAM;QACxD,uBAAkB,GAAlB,kBAAkB,CAAmB;QAAU,mBAAc,GAAd,cAAc,CAAqB;QAClF,qBAAgB,GAAhB,gBAAgB,CAAiB;QAAU,cAAS,GAAT,SAAS,CAAU;QARlE,aAAQ,GAAuB,IAAI,YAAY,EAAQ,CAAC;QAS9D,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChE,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAI,OAAO,KAAc,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEhD;;OAEG;IACH,IAAI,SAAS,KAAgB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACH,IAAI,OAAO,KAAuB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD;;;;;;;;OAQG;IACH,aAAa,CAAC,GAAW;QACvB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAe,EAAE,OAAsB;QAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,OAAO,KAAW,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,aAAa,CAAC,QAAe,EAAE,OAAsB;QACnD,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,GAAY,IAAY,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzE,4BAA4B;QAClC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CACjD,CAAC,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAEO,SAAS,CAAC,GAAY,EAAE,gBAA0B;QACxD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC;aACnF,IAAI,CAAC,QAAQ;YACZ,MAAM,CAAC,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;iBAClD,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC;iBACpD,IAAI,CAAC,OAAO;gBACX,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;oBAC3B,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;wBACnD,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACxD,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BAC9C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;wBACpC,CAAC;wBAAC,IAAI,CAAC,CAAC;4BACN,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC1B,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;QACT,CAAC,CAAC,CAAC;IACT,CAAC;AACH,CAAC;AAGD;IAIE,YAAoB,QAAmB,EAAU,QAAmB;QAAhD,aAAQ,GAAR,QAAQ,CAAW;QAAU,aAAQ,GAAR,QAAQ,CAAW;QAH5D,kBAAa,GAAe,EAAE,CAAC;QAC/B,oBAAe,GAAY,IAAI,CAAC;IAE+B,CAAC;IAExE,QAAQ,CAAC,eAAgC,EAAE,aAAqB;QAC9D,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACzE,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG;YACpF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACR,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,MAAM,CAAC,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CACjB,QAAgC,EAAE,QAAgC,EAClE,SAA0B,EAAE,aAAqB;QACnD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QAE3E,IAAI,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC;IAEO,sBAAsB,CAAC,IAAc;QAC3C,IAAI,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,EAAE,CAAC,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAiB,CAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9E,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACN,MAAM,CAAC,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CACzB,QAAgC,EAAE,QAAgC,EAClE,SAA0B,EAAE,UAAoB;QAClD,IAAI,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,CAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,CAAC,CAAC,CAAC;QACX,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QAEZ,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,CAAC,gBAAgB,CACjB,CAAC,EAAG,YAAsC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACvF,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,OAAO,CACpB,YAAY,EAAE,CAAC,CAAM,CAAC,iBAAiB,EAAE,CAAM,CAAC,iBAAiB,KAC/C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,gBAAgB,CACZ,QAAgC,EAAE,QAAgC,EAClE,eAAgC,EAAE,UAAoB;QACxD,IAAI,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC1B,IAAI,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;QACvD,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE7D,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,qBAAqB,CACtB,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC1C,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACzB,IAAI,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBACxE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB,CACvB,SAA0B,EAAE,IAAkB,EAAE,IAAkB,EAClE,MAAoB;QACtB,IAAI,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CACrC,CAAC,EAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAC,EAAE,EAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;QAChG,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnF,EAAE,CAAC,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEO,SAAS,CAAC,SAA0B,EAAE,OAAqB;QACjE,IAAI,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAC,CAAC;gBAC1C,MAAM,IAAI,aAAa,CAAC,4BAA4B,CAAC,CAAC;YACxD,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,MAAM,IAAI,aAAa,CAAC,0BAA0B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,MAAoB,EAAE,UAAoB;QACjE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YAC5C,gBAAgB,CAAC,OAAO,CACpB,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAM,CAAC,iBAAiB,EAAE,CAAM,CAAC,iBAAiB,KAC/C,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;YACzE,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACzB,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAAA","sourcesContent":["import {Location} from '@angular/common';\nimport {BaseException, ComponentResolver, ReflectiveInjector, provide} from '@angular/core';\n\nimport {DEFAULT_OUTLET_NAME} from './constants';\nimport {RouterOutlet} from './directives/router_outlet';\nimport {EventEmitter, Observable, ObservableWrapper, PromiseWrapper} from './facade/async';\nimport {ListWrapper, StringMapWrapper} from './facade/collection';\nimport {Type, isBlank, isPresent} from './facade/lang';\nimport {CanDeactivate} from './interfaces';\nimport {hasLifecycleHook} from './lifecycle_reflector';\nimport {link} from './link';\nimport {recognize} from './recognize';\nimport {RouterUrlSerializer} from './router_url_serializer';\nimport {RouteSegment, RouteTree, TreeNode, UrlSegment, UrlTree, createEmptyRouteTree, rootNode, routeSegmentComponentFactory, serializeRouteSegmentTree} from './segments';\n\nexport class RouterOutletMap {\n /** @internal */\n _outlets: {[name: string]: RouterOutlet} = {};\n registerOutlet(name: string, outlet: RouterOutlet): void { this._outlets[name] = outlet; }\n}\n\n/**\n * The `Router` is responsible for mapping URLs to components.\n *\n * You can see the state of the router by inspecting the read-only fields `router.urlTree`\n * and `router.routeTree`.\n */\nexport class Router {\n private _routeTree: RouteTree;\n private _urlTree: UrlTree;\n private _locationSubscription: any;\n private _changes: EventEmitter<void> = new EventEmitter<void>();\n\n /**\n * @internal\n */\n constructor(\n private _rootComponent: Object, private _rootComponentType: Type,\n private _componentResolver: ComponentResolver, private _urlSerializer: RouterUrlSerializer,\n private _routerOutletMap: RouterOutletMap, private _location: Location) {\n this._routeTree = createEmptyRouteTree(this._rootComponentType);\n this._setUpLocationChangeListener();\n this.navigateByUrl(this._location.path());\n }\n\n /**\n * Returns the current url tree.\n */\n get urlTree(): UrlTree { return this._urlTree; }\n\n /**\n * Returns the current route tree.\n */\n get routeTree(): RouteTree { return this._routeTree; }\n\n /**\n * An observable or url changes from the router.\n */\n get changes(): Observable<void> { return this._changes; }\n\n /**\n * Navigate based on the provided url. This navigation is always absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigateByUrl(\"/team/33/user/11\");\n * ```\n */\n navigateByUrl(url: string): Promise<void> {\n return this._navigate(this._urlSerializer.parse(url));\n }\n\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no segment is provided, the navigation is absolute.\n *\n * ### Usage\n *\n * ```\n * router.navigate(['team', 33, 'team', '11], segment);\n * ```\n */\n navigate(commands: any[], segment?: RouteSegment): Promise<void> {\n return this._navigate(this.createUrlTree(commands, segment));\n }\n\n /**\n * @internal\n */\n dispose(): void { ObservableWrapper.dispose(this._locationSubscription); }\n\n /**\n * Applies an array of commands to the current url tree and creates\n * a new url tree.\n *\n * When given a segment, applies the given commands starting from the segment.\n * When not given a segment, applies the given command starting from the root.\n *\n * ### Usage\n *\n * ```\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n *\n * // you can collapse static fragments like this\n * router.createUrlTree(['/team/33/user', userId]);\n *\n * // assuming the current url is `/team/33/user/11` and the segment points to `user/11`\n *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], segment);\n *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], segment);\n *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], segment);\n * ```\n */\n createUrlTree(commands: any[], segment?: RouteSegment): UrlTree {\n let s = isPresent(segment) ? segment : this._routeTree.root;\n return link(s, this._routeTree, this.urlTree, commands);\n }\n\n /**\n * Serializes a {@link UrlTree} into a string.\n */\n serializeUrl(url: UrlTree): string { return this._urlSerializer.serialize(url); }\n\n private _setUpLocationChangeListener(): void {\n this._locationSubscription = this._location.subscribe(\n (change) => { this._navigate(this._urlSerializer.parse(change['url']), change['pop']); });\n }\n\n private _navigate(url: UrlTree, preventPushState?: boolean): Promise<void> {\n this._urlTree = url;\n return recognize(this._componentResolver, this._rootComponentType, url, this._routeTree)\n .then(currTree => {\n return new _ActivateSegments(currTree, this._routeTree)\n .activate(this._routerOutletMap, this._rootComponent)\n .then(updated => {\n if (updated) {\n this._routeTree = currTree;\n if (isBlank(preventPushState) || !preventPushState) {\n let path = this._urlSerializer.serialize(this._urlTree);\n if (this._location.isCurrentPathEqualTo(path)) {\n this._location.replaceState(path);\n } else {\n this._location.go(path);\n }\n }\n this._changes.emit(null);\n }\n });\n });\n }\n}\n\n\nclass _ActivateSegments {\n private deactivations: Object[][] = [];\n private performMutation: boolean = true;\n\n constructor(private currTree: RouteTree, private prevTree: RouteTree) {}\n\n activate(parentOutletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n let prevRoot = isPresent(this.prevTree) ? rootNode(this.prevTree) : null;\n let currRoot = rootNode(this.currTree);\n\n return this.canDeactivate(currRoot, prevRoot, parentOutletMap, rootComponent).then(res => {\n this.performMutation = true;\n if (res) {\n this.activateChildSegments(currRoot, prevRoot, parentOutletMap, [rootComponent]);\n }\n return res;\n });\n }\n\n private canDeactivate(\n currRoot: TreeNode<RouteSegment>, prevRoot: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, rootComponent: Object): Promise<boolean> {\n this.performMutation = false;\n this.activateChildSegments(currRoot, prevRoot, outletMap, [rootComponent]);\n\n let allPaths = PromiseWrapper.all(this.deactivations.map(r => this.checkCanDeactivatePath(r)));\n return allPaths.then((values: boolean[]) => values.filter(v => v).length === values.length);\n }\n\n private checkCanDeactivatePath(path: Object[]): Promise<boolean> {\n let curr = PromiseWrapper.resolve(true);\n for (let p of ListWrapper.reversed(path)) {\n curr = curr.then(_ => {\n if (hasLifecycleHook('routerCanDeactivate', p)) {\n return (<CanDeactivate>p).routerCanDeactivate(this.prevTree, this.currTree);\n } else {\n return _;\n }\n });\n }\n return curr;\n }\n\n private activateChildSegments(\n currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n outletMap: RouterOutletMap, components: Object[]): void {\n let prevChildren = isPresent(prevNode) ? prevNode.children.reduce((m, c) => {\n (m as any /** TODO #9100 */)[c.value.outlet] = c;\n return m;\n }, {}) : {};\n\n currNode.children.forEach(c => {\n this.activateSegments(\n c, (prevChildren as any /** TODO #9100 */)[c.value.outlet], outletMap, components);\n StringMapWrapper.delete(prevChildren, c.value.outlet);\n });\n\n StringMapWrapper.forEach(\n prevChildren, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) =>\n this.deactivateOutlet(outletMap._outlets[k], components));\n }\n\n activateSegments(\n currNode: TreeNode<RouteSegment>, prevNode: TreeNode<RouteSegment>,\n parentOutletMap: RouterOutletMap, components: Object[]): void {\n let curr = currNode.value;\n let prev = isPresent(prevNode) ? prevNode.value : null;\n let outlet = this.getOutlet(parentOutletMap, currNode.value);\n\n if (curr === prev) {\n this.activateChildSegments(\n currNode, prevNode, outlet.outletMap, components.concat([outlet.component]));\n } else {\n this.deactivateOutlet(outlet, components);\n if (this.performMutation) {\n let outletMap = new RouterOutletMap();\n let component = this.activateNewSegments(outletMap, curr, prev, outlet);\n this.activateChildSegments(currNode, prevNode, outletMap, components.concat([component]));\n }\n }\n }\n\n private activateNewSegments(\n outletMap: RouterOutletMap, curr: RouteSegment, prev: RouteSegment,\n outlet: RouterOutlet): Object {\n let resolved = ReflectiveInjector.resolve(\n [{provide: RouterOutletMap, useValue: outletMap}, {provide: RouteSegment, useValue: curr}]);\n let ref = outlet.activate(routeSegmentComponentFactory(curr), resolved, outletMap);\n if (hasLifecycleHook('routerOnActivate', ref.instance)) {\n ref.instance.routerOnActivate(curr, prev, this.currTree, this.prevTree);\n }\n return ref.instance;\n }\n\n private getOutlet(outletMap: RouterOutletMap, segment: RouteSegment): RouterOutlet {\n let outlet = outletMap._outlets[segment.outlet];\n if (isBlank(outlet)) {\n if (segment.outlet == DEFAULT_OUTLET_NAME) {\n throw new BaseException(`Cannot find default outlet`);\n } else {\n throw new BaseException(`Cannot find the outlet ${segment.outlet}`);\n }\n }\n return outlet;\n }\n\n private deactivateOutlet(outlet: RouterOutlet, components: Object[]): void {\n if (isPresent(outlet) && outlet.isActivated) {\n StringMapWrapper.forEach(\n outlet.outletMap._outlets, (v: any /** TODO #9100 */, k: any /** TODO #9100 */) =>\n this.deactivateOutlet(v, components));\n if (this.performMutation) {\n outlet.deactivate();\n } else {\n this.deactivations.push(components.concat([outlet.component]));\n }\n }\n }\n}\n\ninterface DecoratorInvocation {\n type: Function;\n args?: any[];\n}\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { ROUTER_PROVIDERS_COMMON } from './router_providers_common';
|
|
2
|
-
import { BrowserPlatformLocation } from '@angular/platform-browser';
|
|
3
|
-
import { PlatformLocation } from '@angular/common';
|
|
4
2
|
/**
|
|
5
|
-
* A list of
|
|
3
|
+
* A list of providers. To use the router, you must add this to your application.
|
|
6
4
|
*
|
|
7
5
|
* ```
|
|
8
6
|
* import {Component} from '@angular/core';
|
|
@@ -23,8 +21,6 @@ import { PlatformLocation } from '@angular/common';
|
|
|
23
21
|
* bootstrap(AppCmp, [ROUTER_PROVIDERS]);
|
|
24
22
|
* ```
|
|
25
23
|
*/
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
/*@ts2dart_Provider*/ { provide: PlatformLocation, useClass: BrowserPlatformLocation },
|
|
29
|
-
];
|
|
24
|
+
// TODO: merge with router_providers_common.ts
|
|
25
|
+
export const ROUTER_PROVIDERS = [ROUTER_PROVIDERS_COMMON];
|
|
30
26
|
//# sourceMappingURL=router_providers.js.map
|