@@ -13,8 +13,7 @@ class RouteViewFactory {
13
13
14
14
void _enterHandler (RouteEnterEvent event, String templateUrl,
15
15
{List <Module > modules, String templateHtml}) {
16
- locationService._route (event.route, templateUrl, fromEvent: true ,
17
- modules: modules, templateHtml: templateHtml);
16
+ locationService._route (event.route, templateUrl, templateHtml, modules);
18
17
}
19
18
20
19
void configure (Map <String , NgRouteCfg > config) {
@@ -32,8 +31,7 @@ class RouteViewFactory {
32
31
dontLeaveOnParamChanges: cfg.dontLeaveOnParamChanges,
33
32
enter: (RouteEnterEvent e) {
34
33
if (cfg.view != null || cfg.viewHtml != null ) {
35
- _enterHandler (e, cfg.view,
36
- modules: newModules, templateHtml: cfg.viewHtml);
34
+ _enterHandler (e, cfg.view, modules: newModules, templateHtml: cfg.viewHtml);
37
35
}
38
36
if (cfg.enter != null ) {
39
37
cfg.enter (e);
@@ -56,11 +54,7 @@ class RouteViewFactory {
56
54
cfg.preEnter (e);
57
55
}
58
56
},
59
- preLeave: (RoutePreLeaveEvent e) {
60
- if (cfg.preLeave != null ) {
61
- cfg.preLeave (e);
62
- }
63
- },
57
+ preLeave: cfg.preLeave,
64
58
leave: cfg.leave,
65
59
mount: (Route mountRoute) {
66
60
if (cfg.mount != null ) {
@@ -71,14 +65,31 @@ class RouteViewFactory {
71
65
}
72
66
}
73
67
74
- NgRouteCfg ngRoute ({String path, String view, String viewHtml,
75
- Map <String , NgRouteCfg > mount, modules (), bool defaultRoute: false ,
76
- RoutePreEnterEventHandler preEnter, RouteEnterEventHandler enter,
77
- RoutePreLeaveEventHandler preLeave, RouteLeaveEventHandler leave,
78
- dontLeaveOnParamChanges: false }) =>
79
- new NgRouteCfg (path: path, view: view, viewHtml: viewHtml, mount: mount,
80
- modules: modules, defaultRoute: defaultRoute, preEnter: preEnter, preLeave: preLeave,
81
- enter: enter, leave: leave, dontLeaveOnParamChanges: dontLeaveOnParamChanges);
68
+ /**
69
+ * Helper function to create a route configuration (`NgRouteCfg` ):
70
+ * - `path` : url section (`/path` ),
71
+ * - `view` : external template,
72
+ * - `viewHtml` : inline template,
73
+ * - `mount` : child routes,
74
+ * - `defaultRoute` : set to `true` for the default route,
75
+ * - `*EventHandler` : event handlers, see route.dart for details,
76
+ * - `dontLeaveOnParamChanges` : do not leave the route when only parameters change
77
+ */
78
+ NgRouteCfg ngRoute ({String path,
79
+ String view,
80
+ String viewHtml,
81
+ Map <String , NgRouteCfg > mount,
82
+ modules (),
83
+ bool defaultRoute: false ,
84
+ RoutePreEnterEventHandler preEnter,
85
+ RouteEnterEventHandler enter,
86
+ RoutePreLeaveEventHandler preLeave,
87
+ RouteLeaveEventHandler leave,
88
+ dontLeaveOnParamChanges: false }) {
89
+ return new NgRouteCfg (path: path, view: view, viewHtml: viewHtml, mount: mount, modules: modules,
90
+ defaultRoute: defaultRoute, preEnter: preEnter, preLeave: preLeave, enter: enter,
91
+ leave: leave, dontLeaveOnParamChanges: dontLeaveOnParamChanges);
92
+ }
82
93
83
94
class NgRouteCfg {
84
95
final String path;
@@ -125,12 +136,11 @@ typedef void RouteInitializerFn(Router router, RouteViewFactory viewFactory);
125
136
@Injectable ()
126
137
class NgRoutingHelper {
127
138
final Router router;
128
- final Application _ngApp;
129
139
final _portals = < NgView > [];
130
140
final _templates = < String , _View > {};
131
141
132
142
NgRoutingHelper (RouteInitializer initializer, Injector injector, this .router,
133
- this ._ngApp ) {
143
+ Application ngApp ) {
134
144
// TODO: move this to constructor parameters when di issue is fixed:
135
145
// https://github.com/angular/di.dart/issues/40
136
146
RouteInitializerFn initializerFn = injector.getByKey (ROUTE_INITIALIZER_FN_KEY );
@@ -144,6 +154,8 @@ class NgRoutingHelper {
144
154
} else {
145
155
initializer.init (router, new RouteViewFactory (this ));
146
156
}
157
+
158
+ // Check if we need to update `ng-view`s when a new route is activated
147
159
router.onRouteStart.listen ((RouteStartEvent routeEvent) {
148
160
routeEvent.completed.then ((success) {
149
161
if (success) {
@@ -152,34 +164,37 @@ class NgRoutingHelper {
152
164
});
153
165
});
154
166
155
- router.listen (appRoot: _ngApp.element);
167
+ // Make the router listen to URL change events and click events
168
+ router.listen (appRoot: ngApp.element);
156
169
}
157
170
158
171
void _reloadViews ({Route startingFrom}) {
159
- var alreadyActiveViews = [];
160
- var activePath = router.activePath;
172
+ var activeViews = < NgView > [];
173
+ Iterable < Route > activePath = router.activePath;
161
174
if (startingFrom != null ) {
175
+ // only consider child routes of the `startingFrom` route
162
176
activePath = activePath.skip (_routeDepth (startingFrom));
163
177
}
178
+
164
179
for (Route route in activePath) {
165
- var viewDef = _templates[_routePath (route)];
180
+ var path = _routePath (route);
181
+ var viewDef = _templates[path];
166
182
if (viewDef == null ) continue ;
167
- var templateUrl = viewDef.template;
168
-
169
- NgView view = _portals. lastWhere (( NgView v) {
170
- return _routePath (route) != _routePath (v._route) &&
171
- _routePath (route). startsWith ( _routePath (v._route) );
172
- }, orElse : () => null );
173
- if (view != null && ! alreadyActiveViews .contains (view)) {
174
- view._show (viewDef, route, viewDef.modules );
175
- alreadyActiveViews .add (view);
183
+
184
+ NgView view = _portals. lastWhere (
185
+ ( NgView v) => path != _routePath (v._parentRoute) &&
186
+ path. startsWith ( _routePath (v._parentRoute)),
187
+ orElse : () => null );
188
+
189
+ if (view != null && ! activeViews .contains (view)) {
190
+ view._show (viewDef, route);
191
+ activeViews .add (view);
176
192
break ;
177
193
}
178
194
}
179
195
}
180
196
181
- void _route (Route route, String template, {bool fromEvent, List <Module > modules,
182
- String templateHtml}) {
197
+ void _route (Route route, String template, String templateHtml, List <Module > modules) {
183
198
_templates[_routePath (route)] = new _View (template, templateHtml, modules);
184
199
}
185
200
@@ -200,22 +215,20 @@ class _View {
200
215
_View (this .template, this .templateHtml, this .modules);
201
216
}
202
217
218
+ /// Returns the route full path (ie `grand-parent.parent.current` )
203
219
String _routePath (Route route) {
204
- final path = [];
205
- var p = route;
206
- while (p.parent != null ) {
220
+ final path = < String > [];
221
+ for (Route p = route; p.parent != null ; p = p.parent) {
207
222
path.insert (0 , p.name);
208
- p = p.parent;
209
223
}
210
224
return path.join ('.' );
211
225
}
212
226
227
+ /// Returns the route depth (ie 3 for `grand-parent.parent.current` )
213
228
int _routeDepth (Route route) {
214
229
var depth = 0 ;
215
- var p = route;
216
- while (p.parent != null ) {
230
+ for (Route p = route; p.parent != null ; p = p.parent) {
217
231
depth++ ;
218
- p = p.parent;
219
232
}
220
233
return depth;
221
234
}
0 commit comments