Skip to content

Commit 14c224d

Browse files
committed
dde9a90 build(router): create alt_router bundle
1 parent f0c03ed commit 14c224d

13 files changed

+326
-84
lines changed

BUILD_INFO

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Sat Apr 30 01:06:35 UTC 2016
2-
d097784d571581fa620a497c65c201e35fdb04c7
1+
Sat Apr 30 01:22:19 UTC 2016
2+
dde9a903ec357d74cd9bcf4e6e37a176fcf327e5

lib/alt_router.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export "src/alt_router/metadata/decorators.dart" show Routes;
1111
export "src/alt_router/metadata/metadata.dart" show Route;
1212
export "src/alt_router/router_url_serializer.dart"
1313
show RouterUrlSerializer, DefaultRouterUrlSerializer;
14-
export "src/alt_router/interfaces.dart" show OnActivate;
14+
export "src/alt_router/interfaces.dart" show OnActivate, CanDeactivate;
1515
export "src/alt_router/router_providers.dart" show ROUTER_PROVIDERS;
1616
import "src/alt_router/directives/router_outlet.dart" show RouterOutlet;
1717
import "src/alt_router/directives/router_link.dart" show RouterLink;

lib/src/alt_router/directives/router_link.dart

+10-9
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,25 @@ import "package:angular2/core.dart"
1414
HostListener,
1515
HostBinding,
1616
Input,
17-
OnDestroy;
17+
OnDestroy,
18+
Optional;
1819
import "../router.dart" show RouterOutletMap, Router;
1920
import "../segments.dart" show RouteSegment, UrlSegment, Tree;
20-
import "../link.dart" show link;
21-
import "package:angular2/src/facade/lang.dart" show isString;
21+
import "package:angular2/src/facade/lang.dart" show isString, isPresent;
2222
import "package:angular2/src/facade/async.dart" show ObservableWrapper;
2323

2424
@Directive(selector: "[routerLink]")
2525
class RouterLink implements OnDestroy {
26+
RouteSegment _routeSegment;
2627
Router _router;
2728
@Input()
2829
String target;
2930
List<dynamic> _changes = [];
30-
Tree<UrlSegment> _targetUrl;
3131
dynamic _subscription;
3232
@HostBinding()
3333
String href;
34-
RouterLink(this._router) {
34+
RouterLink(@Optional() this._routeSegment, this._router) {
3535
this._subscription = ObservableWrapper.subscribe(_router.changes, (_) {
36-
this._targetUrl = _router.urlTree;
3736
this._updateTargetUrlAndHref();
3837
});
3938
}
@@ -50,14 +49,16 @@ class RouterLink implements OnDestroy {
5049
@HostListener("click")
5150
bool onClick() {
5251
if (!isString(this.target) || this.target == "_self") {
53-
this._router.navigate(this._targetUrl);
52+
this._router.navigate(this._changes, this._routeSegment);
5453
return false;
5554
}
5655
return true;
5756
}
5857

5958
void _updateTargetUrlAndHref() {
60-
this._targetUrl = link(null, this._router.urlTree, this._changes);
61-
this.href = this._router.serializeUrl(this._targetUrl);
59+
var tree = this._router.createUrlTree(this._changes, this._routeSegment);
60+
if (isPresent(tree)) {
61+
this.href = this._router.serializeUrl(tree);
62+
}
6263
}
6364
}

lib/src/alt_router/directives/router_outlet.dart

+8-3
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@ class RouterOutlet {
3030
this._loaded = null;
3131
}
3232

33+
Object get loadedComponent {
34+
return isPresent(this._loaded) ? this._loaded.instance : null;
35+
}
36+
37+
bool get isLoaded {
38+
return isPresent(this._loaded);
39+
}
40+
3341
ComponentRef load(ComponentFactory factory,
3442
List<ResolvedReflectiveProvider> providers, RouterOutletMap outletMap) {
35-
if (isPresent(this._loaded)) {
36-
this.unload();
37-
}
3843
this.outletMap = outletMap;
3944
var inj = ReflectiveInjector.fromResolvedProviders(
4045
providers, this._location.parentInjector);

lib/src/alt_router/interfaces.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
library angular2.src.alt_router.interfaces;
22

3+
import "dart:async";
34
import "segments.dart" show RouteSegment, Tree;
45

56
abstract class OnActivate {
@@ -8,3 +9,8 @@ abstract class OnActivate {
89
Tree<RouteSegment> currTree,
910
Tree<RouteSegment> prevTree]);
1011
}
12+
13+
abstract class CanDeactivate {
14+
Future<bool> routerCanDeactivate(
15+
[Tree<RouteSegment> currTree, Tree<RouteSegment> futureTree]);
16+
}

lib/src/alt_router/lifecycle_reflector.dart

+1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ import './interfaces.dart';
22

33
bool hasLifecycleHook(String name, Object obj) {
44
if (name == "routerOnActivate") return obj is OnActivate;
5+
if (name == "routerCanDeactivate") return obj is CanDeactivate;
56
return false;
67
}

lib/src/alt_router/link.dart

+60-8
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,68 @@ library angular2.src.alt_router.link;
22

33
import "segments.dart" show Tree, TreeNode, UrlSegment, RouteSegment, rootNode;
44
import "package:angular2/src/facade/lang.dart"
5-
show isBlank, isString, isStringMap;
5+
show isBlank, isPresent, isString, isStringMap;
66
import "package:angular2/src/facade/collection.dart" show ListWrapper;
77

8-
Tree<UrlSegment> link(
9-
RouteSegment segment, Tree<UrlSegment> tree, List<dynamic> change) {
10-
if (identical(change.length, 0)) return tree;
11-
var normalizedChange = (identical(change.length, 1) && change[0] == "/")
12-
? change
13-
: (new List.from(["/"])..addAll(change));
14-
return new Tree<UrlSegment>(_update(rootNode(tree), normalizedChange));
8+
Tree<UrlSegment> link(RouteSegment segment, Tree<RouteSegment> routeTree,
9+
Tree<UrlSegment> urlTree, List<dynamic> change) {
10+
if (identical(change.length, 0)) return urlTree;
11+
var startingNode;
12+
var normalizedChange;
13+
if (isString(change[0]) && change[0].startsWith("./")) {
14+
normalizedChange = (new List.from(["/", change[0].substring(2)])
15+
..addAll(ListWrapper.slice(change, 1)));
16+
startingNode = _findStartingNode(
17+
_findUrlSegment(segment, routeTree), rootNode(urlTree));
18+
} else if (isString(change[0]) &&
19+
identical(change.length, 1) &&
20+
change[0] == "/") {
21+
normalizedChange = change;
22+
startingNode = rootNode(urlTree);
23+
} else if (isString(change[0]) && !change[0].startsWith("/")) {
24+
normalizedChange = (new List.from(["/"])..addAll(change));
25+
startingNode = _findStartingNode(
26+
_findUrlSegment(segment, routeTree), rootNode(urlTree));
27+
} else {
28+
normalizedChange = (new List.from(["/"])..addAll(change));
29+
startingNode = rootNode(urlTree);
30+
}
31+
var updated = _update(startingNode, normalizedChange);
32+
var newRoot = _constructNewTree(rootNode(urlTree), startingNode, updated);
33+
return new Tree<UrlSegment>(newRoot);
34+
}
35+
36+
UrlSegment _findUrlSegment(RouteSegment segment, Tree<RouteSegment> routeTree) {
37+
var s = segment;
38+
var res = null;
39+
while (isBlank(res)) {
40+
res = ListWrapper.last(s.urlSegments);
41+
s = routeTree.parent(s);
42+
}
43+
return res;
44+
}
45+
46+
TreeNode<UrlSegment> _findStartingNode(
47+
UrlSegment segment, TreeNode<UrlSegment> node) {
48+
if (identical(node.value, segment)) return node;
49+
for (var c in node.children) {
50+
var r = _findStartingNode(segment, c);
51+
if (isPresent(r)) return r;
52+
}
53+
return null;
54+
}
55+
56+
TreeNode<UrlSegment> _constructNewTree(TreeNode<UrlSegment> node,
57+
TreeNode<UrlSegment> original, TreeNode<UrlSegment> updated) {
58+
if (identical(node, original)) {
59+
return new TreeNode<UrlSegment>(node.value, updated.children);
60+
} else {
61+
return new TreeNode<UrlSegment>(
62+
node.value,
63+
node.children
64+
.map((c) => _constructNewTree(c, original, updated))
65+
.toList());
66+
}
1567
}
1668

1769
TreeNode<UrlSegment> _update(TreeNode<UrlSegment> node, List<dynamic> changes) {

lib/src/alt_router/recognize.dart

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import "package:angular2/core.dart" show ComponentResolver;
1313
import "constants.dart" show DEFAULT_OUTLET_NAME;
1414
import "package:angular2/src/core/reflection/reflection.dart" show reflector;
1515

16+
// TODO: vsavkin: recognize should take the old tree and merge it
1617
Future<Tree<RouteSegment>> recognize(
1718
ComponentResolver componentResolver, Type type, Tree<UrlSegment> url) {
1819
var matched =

0 commit comments

Comments
 (0)