Skip to content

Commit 61fd873

Browse files
committed
Core: Router - routes beforeEnter and beforeLeave callbacks
1 parent 1ed6936 commit 61fd873

File tree

4 files changed

+124
-70
lines changed

4 files changed

+124
-70
lines changed

src/core/modules/router/back.js

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Utils from '../../utils/utils';
44
import Device from '../../utils/device';
55
import History from '../../utils/history';
66
import redirect from './redirect';
7-
import preRoute from './pre-route';
7+
import processRouteQueue from './process-route-queue';
88

99
function backward(el, backwardOptions) {
1010
const router = this;
@@ -403,7 +403,7 @@ function back(...args) {
403403
const router = this;
404404
const app = router.app;
405405
if (!router.view) {
406-
app.views.main.router.back(navigateUrl, navigateOptions);
406+
app.views.main.router.back(...args);
407407
return router;
408408
}
409409

@@ -448,13 +448,30 @@ function back(...args) {
448448
}
449449
const $previousPage = router.$el.children('.page-current').prevAll('.page-previous').eq(0);
450450
if (!navigateOptions.force && $previousPage.length > 0) {
451-
if (router.params.pushState && $previousPage[0].f7Page && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url) {
452-
router.back(router.history[router.history.length - 2], Utils.extend(navigateOptions, { force: true }));
451+
if (router.params.pushState
452+
&& $previousPage[0].f7Page
453+
&& router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url
454+
) {
455+
router.back(
456+
router.history[router.history.length - 2],
457+
Utils.extend(navigateOptions, { force: true })
458+
);
453459
return router;
454460
}
455-
router.loadBack({ el: $previousPage }, Utils.extend(navigateOptions, {
456-
route: $previousPage[0].f7Page.route,
457-
}));
461+
462+
const previousPageRoute = $previousPage[0].f7Page.route;
463+
processRouteQueue.call(
464+
router,
465+
previousPageRoute,
466+
router.currentRoute,
467+
() => {
468+
router.loadBack({ el: $previousPage }, Utils.extend(navigateOptions, {
469+
route: previousPageRoute,
470+
}));
471+
},
472+
() => {}
473+
);
474+
458475
return router;
459476
}
460477

@@ -548,23 +565,20 @@ function back(...args) {
548565
router.allowPageChange = true;
549566
}
550567

551-
if (router.params.preRoute || route.route.preRoute) {
552-
router.allowPageChange = false;
553-
preRoute.call(
568+
if (options.preload) {
569+
resolve();
570+
} else {
571+
processRouteQueue.call(
554572
router,
555-
route.route.preRoute,
556573
route,
557574
router.currentRoute,
558575
() => {
559-
router.allowPageChange = true;
560576
resolve();
561577
},
562578
() => {
563579
reject();
564580
},
565581
);
566-
} else {
567-
resolve();
568582
}
569583

570584
// Return Router

src/core/modules/router/navigate.js

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { document } from 'ssr-window';
33
import Utils from '../../utils/utils';
44
import History from '../../utils/history';
55
import redirect from './redirect';
6-
import preRoute from './pre-route';
6+
import processRouteQueue from './process-route-queue';
77

88
function refreshPage() {
99
const router = this;
@@ -601,24 +601,17 @@ function navigate(navigateParams, navigateOptions = {}) {
601601
router.allowPageChange = true;
602602
}
603603

604-
if (router.params.preRoute || route.route.preRoute) {
605-
router.allowPageChange = false;
606-
preRoute.call(
607-
router,
608-
route.route.preRoute,
609-
route,
610-
router.currentRoute,
611-
() => {
612-
router.allowPageChange = true;
613-
resolve();
614-
},
615-
() => {
616-
reject();
617-
},
618-
);
619-
} else {
620-
resolve();
621-
}
604+
processRouteQueue.call(
605+
router,
606+
route,
607+
router.currentRoute,
608+
() => {
609+
resolve();
610+
},
611+
() => {
612+
reject();
613+
},
614+
);
622615

623616
// Return Router
624617
return router;

src/core/modules/router/pre-route.js

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
function processQueue(router, routerQueue, routeQueue, to, from, resolve, reject) {
2+
const queue = [];
3+
4+
if (Array.isArray(routeQueue)) {
5+
queue.push(...routeQueue);
6+
} else if (routeQueue && typeof routeQueue === 'function') {
7+
queue.push(routeQueue);
8+
}
9+
if (routerQueue) {
10+
if (Array.isArray(routerQueue)) {
11+
queue.push(...routerQueue);
12+
} else {
13+
queue.push(routerQueue);
14+
}
15+
}
16+
17+
function next() {
18+
if (queue.length === 0) {
19+
resolve();
20+
return;
21+
}
22+
const queueItem = queue.shift();
23+
24+
queueItem.call(
25+
router,
26+
to,
27+
from,
28+
() => {
29+
next();
30+
},
31+
() => {
32+
reject();
33+
}
34+
);
35+
}
36+
next();
37+
}
38+
39+
export default function (to, from, resolve, reject) {
40+
const router = this;
41+
function enterNextRoute() {
42+
if (router.params.beforeEnter || to.route.beforeEnter) {
43+
router.allowPageChange = false;
44+
processQueue(
45+
router,
46+
router.params.beforeEnter,
47+
to.route.beforeEnter,
48+
to,
49+
from,
50+
() => {
51+
router.allowPageChange = true;
52+
resolve();
53+
},
54+
() => {
55+
reject();
56+
},
57+
);
58+
} else {
59+
resolve();
60+
}
61+
}
62+
function leaveCurrentRoute() {
63+
if (router.params.beforeLeave || from.route.beforeLeave) {
64+
router.allowPageChange = false;
65+
processQueue(
66+
router,
67+
router.params.beforeLeave,
68+
from.route.beforeLeave,
69+
to,
70+
from,
71+
() => {
72+
router.allowPageChange = true;
73+
enterNextRoute();
74+
},
75+
() => {
76+
reject();
77+
},
78+
);
79+
} else {
80+
enterNextRoute();
81+
}
82+
}
83+
leaveCurrentRoute();
84+
}

0 commit comments

Comments
 (0)