diff --git a/api/router.js b/api/router.js index 4d893acc..881e3409 100644 --- a/api/router.js +++ b/api/router.js @@ -23,7 +23,7 @@ module.exports = function($window, redrawService) { if (path !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true}) else throw new Error("Could not resolve default route " + defaultRoute) } - routeService.defineRoutes(routes, function(payload, params, path) { + routeService.defineRoutes(routes, function(payload, params, path, route) { var update = lastUpdate = function(routeResolver, comp) { if (update !== lastUpdate) return component = comp != null && (typeof comp.view === "function" || typeof comp === "function")? comp : "div" @@ -34,7 +34,7 @@ module.exports = function($window, redrawService) { if (payload.view || typeof payload === "function") update({}, payload) else { if (payload.onmatch) { - Promise.resolve(payload.onmatch(params, path)).then(function(resolved) { + Promise.resolve(payload.onmatch(params, path, route)).then(function(resolved) { update(payload, resolved) }, bail) } diff --git a/api/tests/test-router.js b/api/tests/test-router.js index f5336625..059fcbbf 100644 --- a/api/tests/test-router.js +++ b/api/tests/test-router.js @@ -321,11 +321,12 @@ o.spec("route", function() { } var resolver = { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { matchCount++ o(args.id).equals("abc") o(requestedPath).equals("/abc") + o(route).equals("/:id") o(this).equals(resolver) return Component }, @@ -362,11 +363,12 @@ o.spec("route", function() { } var resolver = { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { matchCount++ o(args.id).equals("abc") o(requestedPath).equals("/abc") + o(route).equals("/:id") o(this).equals(resolver) return Promise.resolve(Component) }, @@ -398,11 +400,12 @@ o.spec("route", function() { var renderCount = 0 var resolver = { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { matchCount++ o(args.id).equals("abc") o(requestedPath).equals("/abc") + o(route).equals("/:id") o(this).equals(resolver) return Promise.resolve() }, @@ -434,11 +437,12 @@ o.spec("route", function() { var renderCount = 0 var resolver = { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { matchCount++ o(args.id).equals("abc") o(requestedPath).equals("/abc") + o(route).equals("/:id") o(this).equals(resolver) return Promise.resolve([]) }, @@ -508,11 +512,12 @@ o.spec("route", function() { $window.location.href = prefix + "/abc" route(root, "/abc", { "/:id" : { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { matchCount++ o(args.id).equals("abc") o(requestedPath).equals("/abc") + o(route).equals("/:id") return Component }, diff --git a/docs/route.md b/docs/route.md index 573ea23c..55af722f 100644 --- a/docs/route.md +++ b/docs/route.md @@ -176,12 +176,13 @@ This method also allows you to asynchronously define what component will be rend For more information on `onmatch`, see the [advanced component resolution](#advanced-component-resolution) section -`routeResolver.onmatch(args, requestedPath)` +`routeResolver.onmatch(args, requestedPath, route)` Argument | Type | Description --------------- | ---------------------------------------- | --- `args` | `Object` | The [routing parameters](#routing-parameters) `requestedPath` | `String` | The router path requested by the last routing action, including interpolated routing parameter values, but without the prefix. When `onmatch` is called, the resolution for this path is not complete and `m.route.get()` still returns the previous path. +`route` | `String` | The router path requested by the last routing action, excluding interpolated routing parameter values **returns** | `Component|Promise|undefined` | Returns a component or a promise that resolves to a component If `onmatch` returns a component or a promise that resolves to a component, this component is used as the `vnode.tag` for the first argument in the RouteResolver's `render` method. Otherwise, `vnode.tag` is set to `"div"`. Similarly, if the `onmatch` method is omitted, `vnode.tag` is also `"div"`. @@ -429,7 +430,7 @@ Instead of mapping a component to a route, you can specify a RouteResolver objec ```javascript m.route(document.body, "/", { "/": { - onmatch: function(args, requestedPath) { + onmatch: function(args, requestedPath, route) { return Home }, render: function(vnode) {