Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 7329d47

Browse files
pavelgjchirayuk
authored andcommitted
feat(router): added vetoable preLeave event
BREAKING CHANGE Previously, vetoing was allowed on leave (RouteLeaveEvent) which caused issues because routes had no way to recover from other route vetoing a leave event. Now, similar to preEnter and enter, leave event was split into vetoable preLeave (RoutePreLeaveEvent) and non-vetoable leave (RouteLeaveEvent). views.configure({ 'foo': ngRoute( path: '/foo', preLeave: (RoutePreLeaveEvent e) { e.allowLeave(new Future.value(false)); }) });
1 parent 7230887 commit 7329d47

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

Diff for: lib/routing/routing.dart

+9-3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ class RouteViewFactory {
5555
cfg.preEnter(e);
5656
}
5757
},
58+
preLeave: (RoutePreLeaveEvent e) {
59+
if (cfg.preLeave != null) {
60+
cfg.preLeave(e);
61+
}
62+
},
5863
leave: cfg.leave,
5964
mount: (Route mountRoute) {
6065
if (cfg.mount != null) {
@@ -68,10 +73,10 @@ class RouteViewFactory {
6873
NgRouteCfg ngRoute({String path, String view, String viewHtml,
6974
Map<String, NgRouteCfg> mount, modules(), bool defaultRoute: false,
7075
RoutePreEnterEventHandler preEnter, RouteEnterEventHandler enter,
71-
RouteLeaveEventHandler leave}) =>
76+
RoutePreLeaveEventHandler preLeave, RouteLeaveEventHandler leave}) =>
7277
new NgRouteCfg(path: path, view: view, viewHtml: viewHtml, mount: mount,
7378
modules: modules, defaultRoute: defaultRoute, preEnter: preEnter,
74-
enter: enter, leave: leave);
79+
preLeave: preLeave, enter: enter, leave: leave);
7580

7681
class NgRouteCfg {
7782
final String path;
@@ -82,10 +87,11 @@ class NgRouteCfg {
8287
final bool defaultRoute;
8388
final RouteEnterEventHandler enter;
8489
final RoutePreEnterEventHandler preEnter;
90+
final RoutePreLeaveEventHandler preLeave;
8591
final RouteLeaveEventHandler leave;
8692

8793
NgRouteCfg({this.view, this.viewHtml, this.path, this.mount, this.modules,
88-
this.defaultRoute, this.enter, this.preEnter, this.leave});
94+
this.defaultRoute, this.enter, this.preEnter, this.preLeave, this.leave});
8995
}
9096

9197
/**

Diff for: test/angular_spec.dart

+2
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ main() {
266266
"route.client.RouteLeaveEventHandler",
267267
"route.client.RoutePreEnterEvent",
268268
"route.client.RoutePreEnterEventHandler",
269+
"route.client.RoutePreLeaveEvent",
270+
"route.client.RoutePreLeaveEventHandler",
269271
"route.client.Router",
270272
"route.client.RouteStartEvent",
271273
"url_matcher.UrlMatch",

Diff for: test/routing/routing_spec.dart

+60
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,66 @@ main() {
169169
}));
170170

171171

172+
it('should call preEnter callback and be able to veto', async(() {
173+
int preEnterCount = 0;
174+
initRouter((Router router, RouteViewFactory views) {
175+
views.configure({
176+
'foo': ngRoute(
177+
path: '/foo',
178+
preEnter: (RoutePreEnterEvent e) {
179+
preEnterCount++;
180+
e.allowEnter(new Future.value(false));
181+
},
182+
view: 'foo.html'
183+
),
184+
});
185+
});
186+
187+
Element root = _.compile('<ng-view></ng-view>');
188+
expect(root.text).toEqual('');
189+
190+
router.route('/foo');
191+
microLeap();
192+
193+
expect(preEnterCount).toBe(1);
194+
expect(root.text).toEqual(''); // didn't enter.
195+
}));
196+
197+
198+
it('should call preLeave callback and be able to veto', async(() {
199+
int preLeaveCount = 0;
200+
initRouter((Router router, RouteViewFactory views) {
201+
views.configure({
202+
'foo': ngRoute(
203+
path: '/foo',
204+
preLeave: (RoutePreLeaveEvent e) {
205+
preLeaveCount++;
206+
e.allowLeave(new Future.value(false));
207+
},
208+
view: 'foo.html'
209+
),
210+
});
211+
});
212+
_.injector.get(TemplateCache)
213+
.put('foo.html', new HttpResponse(200, '<h1>Foo</h1>'));
214+
215+
Element root = _.compile('<ng-view></ng-view>');
216+
expect(root.text).toEqual('');
217+
218+
router.route('/foo');
219+
microLeap();
220+
221+
expect(preLeaveCount).toBe(0);
222+
expect(root.text).toEqual('Foo');
223+
224+
router.route('');
225+
microLeap();
226+
227+
expect(preLeaveCount).toBe(1);
228+
expect(root.text).toEqual('Foo'); // didn't leave.
229+
}));
230+
231+
172232
it('should call preEnter callback and load modules', async(() {
173233
int preEnterCount = 0;
174234
int modulesCount = 0;

0 commit comments

Comments
 (0)