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

Commit

Permalink
feat(router): added vetoable preLeave event
Browse files Browse the repository at this point in the history
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));
          })
    });
  • Loading branch information
pavelgj authored and chirayuk committed Jun 5, 2014
1 parent 7230887 commit 7329d47
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 3 deletions.
12 changes: 9 additions & 3 deletions lib/routing/routing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ class RouteViewFactory {
cfg.preEnter(e);
}
},
preLeave: (RoutePreLeaveEvent e) {
if (cfg.preLeave != null) {
cfg.preLeave(e);
}
},
leave: cfg.leave,
mount: (Route mountRoute) {
if (cfg.mount != null) {
Expand All @@ -68,10 +73,10 @@ class RouteViewFactory {
NgRouteCfg ngRoute({String path, String view, String viewHtml,
Map<String, NgRouteCfg> mount, modules(), bool defaultRoute: false,
RoutePreEnterEventHandler preEnter, RouteEnterEventHandler enter,
RouteLeaveEventHandler leave}) =>
RoutePreLeaveEventHandler preLeave, RouteLeaveEventHandler leave}) =>
new NgRouteCfg(path: path, view: view, viewHtml: viewHtml, mount: mount,
modules: modules, defaultRoute: defaultRoute, preEnter: preEnter,
enter: enter, leave: leave);
preLeave: preLeave, enter: enter, leave: leave);

class NgRouteCfg {
final String path;
Expand All @@ -82,10 +87,11 @@ class NgRouteCfg {
final bool defaultRoute;
final RouteEnterEventHandler enter;
final RoutePreEnterEventHandler preEnter;
final RoutePreLeaveEventHandler preLeave;
final RouteLeaveEventHandler leave;

NgRouteCfg({this.view, this.viewHtml, this.path, this.mount, this.modules,
this.defaultRoute, this.enter, this.preEnter, this.leave});
this.defaultRoute, this.enter, this.preEnter, this.preLeave, this.leave});
}

/**
Expand Down
2 changes: 2 additions & 0 deletions test/angular_spec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,8 @@ main() {
"route.client.RouteLeaveEventHandler",
"route.client.RoutePreEnterEvent",
"route.client.RoutePreEnterEventHandler",
"route.client.RoutePreLeaveEvent",
"route.client.RoutePreLeaveEventHandler",
"route.client.Router",
"route.client.RouteStartEvent",
"url_matcher.UrlMatch",
Expand Down
60 changes: 60 additions & 0 deletions test/routing/routing_spec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,66 @@ main() {
}));


it('should call preEnter callback and be able to veto', async(() {
int preEnterCount = 0;
initRouter((Router router, RouteViewFactory views) {
views.configure({
'foo': ngRoute(
path: '/foo',
preEnter: (RoutePreEnterEvent e) {
preEnterCount++;
e.allowEnter(new Future.value(false));
},
view: 'foo.html'
),
});
});

Element root = _.compile('<ng-view></ng-view>');
expect(root.text).toEqual('');

router.route('/foo');
microLeap();

expect(preEnterCount).toBe(1);
expect(root.text).toEqual(''); // didn't enter.
}));


it('should call preLeave callback and be able to veto', async(() {
int preLeaveCount = 0;
initRouter((Router router, RouteViewFactory views) {
views.configure({
'foo': ngRoute(
path: '/foo',
preLeave: (RoutePreLeaveEvent e) {
preLeaveCount++;
e.allowLeave(new Future.value(false));
},
view: 'foo.html'
),
});
});
_.injector.get(TemplateCache)
.put('foo.html', new HttpResponse(200, '<h1>Foo</h1>'));

Element root = _.compile('<ng-view></ng-view>');
expect(root.text).toEqual('');

router.route('/foo');
microLeap();

expect(preLeaveCount).toBe(0);
expect(root.text).toEqual('Foo');

router.route('');
microLeap();

expect(preLeaveCount).toBe(1);
expect(root.text).toEqual('Foo'); // didn't leave.
}));


it('should call preEnter callback and load modules', async(() {
int preEnterCount = 0;
int modulesCount = 0;
Expand Down

0 comments on commit 7329d47

Please sign in to comment.