Skip to content

Commit 85a5a9b

Browse files
committed
4d30b3c cleanup(router): make analyzer happy
1 parent e940bc6 commit 85a5a9b

20 files changed

Lines changed: 1731 additions & 801 deletions

BUILD_INFO

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Fri Apr 29 02:23:30 UTC 2016
2-
073ec0a7eb581fb40e925ad8487d50b2e70ad029
1+
Fri Apr 29 02:55:38 UTC 2016
2+
4d30b3c20ed3fe3dafac70c02bdbe632063bd786

_analyzer.dart

Lines changed: 540 additions & 534 deletions
Large diffs are not rendered by default.

lib/alt_router.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
library angular2.alt_router;
77

88
export "src/alt_router/router.dart" show Router, RouterOutletMap;
9-
export "src/alt_router/segments.dart" show RouteSegment;
9+
export "src/alt_router/segments.dart" show RouteSegment, UrlSegment, Tree;
1010
export "src/alt_router/metadata/decorators.dart" show Routes;
1111
export "src/alt_router/metadata/metadata.dart" show Route;
12-
export "src/alt_router/router_url_parser.dart"
13-
show RouterUrlParser, DefaultRouterUrlParser;
12+
export "src/alt_router/router_url_serializer.dart"
13+
show RouterUrlSerializer, DefaultRouterUrlSerializer;
1414
export "src/alt_router/interfaces.dart" show OnActivate;
15+
export "src/alt_router/router_providers.dart" show ROUTER_PROVIDERS;
1516
import "src/alt_router/directives/router_outlet.dart" show RouterOutlet;
17+
import "src/alt_router/directives/router_link.dart" show RouterLink;
1618

17-
const List<dynamic> ROUTER_DIRECTIVES = const [RouterOutlet];
19+
const List<dynamic> ROUTER_DIRECTIVES = const [RouterOutlet, RouterLink];

lib/src/alt_router/constants.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
library angular2.src.alt_router.constants;
2+
3+
const DEFAULT_OUTLET_NAME = "__DEFAULT";
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
library angular2.src.alt_router.directives.router_link;
2+
3+
import "package:angular2/core.dart"
4+
show
5+
ResolvedReflectiveProvider,
6+
Directive,
7+
DynamicComponentLoader,
8+
ViewContainerRef,
9+
Attribute,
10+
ComponentRef,
11+
ComponentFactory,
12+
ReflectiveInjector,
13+
OnInit,
14+
HostListener,
15+
HostBinding,
16+
Input,
17+
OnDestroy;
18+
import "../router.dart" show RouterOutletMap, Router;
19+
import "../segments.dart" show RouteSegment, UrlSegment, Tree;
20+
import "../link.dart" show link;
21+
import "package:angular2/src/facade/lang.dart" show isString;
22+
import "package:angular2/src/facade/async.dart" show ObservableWrapper;
23+
24+
@Directive(selector: "[routerLink]")
25+
class RouterLink implements OnDestroy {
26+
Router _router;
27+
@Input()
28+
String target;
29+
List<dynamic> _changes = [];
30+
Tree<UrlSegment> _targetUrl;
31+
dynamic _subscription;
32+
@HostBinding()
33+
String href;
34+
RouterLink(this._router) {
35+
this._subscription = ObservableWrapper.subscribe(_router.changes, (_) {
36+
this._targetUrl = _router.urlTree;
37+
this._updateTargetUrlAndHref();
38+
});
39+
}
40+
ngOnDestroy() {
41+
ObservableWrapper.dispose(this._subscription);
42+
}
43+
44+
@Input()
45+
set routerLink(List<dynamic> data) {
46+
this._changes = data;
47+
this._updateTargetUrlAndHref();
48+
}
49+
50+
@HostListener("click")
51+
bool onClick() {
52+
if (!isString(this.target) || this.target == "_self") {
53+
this._router.navigate(this._targetUrl);
54+
return false;
55+
}
56+
return true;
57+
}
58+
59+
void _updateTargetUrlAndHref() {
60+
this._targetUrl = link(null, this._router.urlTree, this._changes);
61+
this.href = this._router.serializeUrl(this._targetUrl);
62+
}
63+
}

lib/src/alt_router/directives/router_outlet.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,34 @@ import "package:angular2/core.dart"
66
Directive,
77
DynamicComponentLoader,
88
ViewContainerRef,
9-
Input,
9+
Attribute,
1010
ComponentRef,
1111
ComponentFactory,
12-
ReflectiveInjector;
12+
ReflectiveInjector,
13+
OnInit;
1314
import "../router.dart" show RouterOutletMap;
14-
import "package:angular2/src/facade/lang.dart" show isPresent;
15+
import "../constants.dart" show DEFAULT_OUTLET_NAME;
16+
import "package:angular2/src/facade/lang.dart" show isPresent, isBlank;
1517

1618
@Directive(selector: "router-outlet")
1719
class RouterOutlet {
1820
ViewContainerRef _location;
1921
ComponentRef _loaded;
2022
RouterOutletMap outletMap;
21-
@Input()
22-
String name = "";
23-
RouterOutlet(RouterOutletMap parentOutletMap, this._location) {
24-
parentOutletMap.registerOutlet("", this);
23+
RouterOutlet(RouterOutletMap parentOutletMap, this._location,
24+
@Attribute("name") String name) {
25+
parentOutletMap.registerOutlet(
26+
isBlank(name) ? DEFAULT_OUTLET_NAME : name, this);
2527
}
28+
void unload() {
29+
this._loaded.destroy();
30+
this._loaded = null;
31+
}
32+
2633
ComponentRef load(ComponentFactory factory,
2734
List<ResolvedReflectiveProvider> providers, RouterOutletMap outletMap) {
2835
if (isPresent(this._loaded)) {
29-
this._loaded.destroy();
36+
this.unload();
3037
}
3138
this.outletMap = outletMap;
3239
var inj = ReflectiveInjector.fromResolvedProviders(

lib/src/alt_router/link.dart

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
library angular2.src.alt_router.link;
2+
3+
import "segments.dart" show Tree, TreeNode, UrlSegment, RouteSegment, rootNode;
4+
import "package:angular2/src/facade/lang.dart"
5+
show isBlank, isString, isStringMap;
6+
import "package:angular2/src/facade/collection.dart" show ListWrapper;
7+
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));
15+
}
16+
17+
TreeNode<UrlSegment> _update(TreeNode<UrlSegment> node, List<dynamic> changes) {
18+
var rest = ListWrapper.slice(changes, 1);
19+
var outlet = _outlet(changes);
20+
var segment = _segment(changes);
21+
if (isString(segment) && segment[0] == "/") segment = segment.substring(1);
22+
// reach the end of the tree => create new tree nodes.
23+
if (isBlank(node)) {
24+
var urlSegment = new UrlSegment(segment, null, outlet);
25+
var children = identical(rest.length, 0) ? [] : [_update(null, rest)];
26+
return new TreeNode<UrlSegment>(urlSegment, children);
27+
} else if (outlet != node.value.outlet) {
28+
return node;
29+
} else {
30+
var urlSegment = isStringMap(segment)
31+
? new UrlSegment(null, segment, null)
32+
: new UrlSegment(segment, null, outlet);
33+
if (identical(rest.length, 0)) {
34+
return new TreeNode<UrlSegment>(urlSegment, []);
35+
}
36+
return new TreeNode<UrlSegment>(
37+
urlSegment, _updateMany(ListWrapper.clone(node.children), rest));
38+
}
39+
}
40+
41+
List<TreeNode<UrlSegment>> _updateMany(
42+
List<TreeNode<UrlSegment>> nodes, List<dynamic> changes) {
43+
var outlet = _outlet(changes);
44+
var nodesInRightOutlet =
45+
nodes.where((c) => c.value.outlet == outlet).toList();
46+
if (nodesInRightOutlet.length > 0) {
47+
var nodeRightOutlet = nodesInRightOutlet[0];
48+
nodes[nodes.indexOf(nodeRightOutlet)] = _update(nodeRightOutlet, changes);
49+
} else {
50+
nodes.add(_update(null, changes));
51+
}
52+
return nodes;
53+
}
54+
55+
dynamic _segment(List<dynamic> changes) {
56+
if (!isString(changes[0])) return changes[0];
57+
var parts = changes[0].toString().split(":");
58+
return parts.length > 1 ? parts[1] : changes[0];
59+
}
60+
61+
String _outlet(List<dynamic> changes) {
62+
if (!isString(changes[0])) return null;
63+
var parts = changes[0].toString().split(":");
64+
return parts.length > 1 ? parts[0] : null;
65+
}

0 commit comments

Comments
 (0)