Skip to content
This repository has been archived by the owner on Dec 19, 2017. It is now read-only.

Commit

Permalink
Bug 64 (#65)
Browse files Browse the repository at this point in the history
* addBeforeNavigate nested specs

* fix bug #64
  • Loading branch information
caseyWebb committed Jun 9, 2016
1 parent 2a831cf commit 02ad3c9
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 29 deletions.
18 changes: 11 additions & 7 deletions dist/ko-component-router.js
Original file line number Diff line number Diff line change
Expand Up @@ -468,28 +468,32 @@ return /******/ (function(modules) { // webpackBootstrap
key: 'runBeforeNavigateCallbacks',
value: function runBeforeNavigateCallbacks() {
var ctx = this;
var callbacks = [];

return run();
while (ctx) {
callbacks = ctx._beforeNavigateCallbacks.concat(callbacks);
ctx = ctx.$child;
}

function run() {
var i = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];
return run(callbacks);

function run(callbacks) {
return new Promise(function (resolve) {
if (i === ctx._beforeNavigateCallbacks.length) {
if (callbacks.length === 0) {
return resolve(true);
}
var cb = ctx._beforeNavigateCallbacks[i];
var cb = callbacks.shift();
var recursiveResolve = function recursiveResolve() {
var shouldUpdate = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
return shouldUpdate ? run(++i).then(resolve) : resolve(false);
return shouldUpdate ? run(callbacks).then(resolve) : resolve(false);
};

if (cb.length === 1) {
cb(recursiveResolve);
} else {
var v = cb();
if ((0, _utils.isUndefined)(v) || typeof v.then !== 'function') {
resolve(v !== false);
recursiveResolve(v);
} else {
v.then(recursiveResolve);
}
Expand Down
2 changes: 1 addition & 1 deletion dist/ko-component-router.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion example/dist/bundle.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion example/dist/bundle.js.map

Large diffs are not rendered by default.

18 changes: 11 additions & 7 deletions lib/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,28 +193,32 @@ var Context = function () {
key: 'runBeforeNavigateCallbacks',
value: function runBeforeNavigateCallbacks() {
var ctx = this;
var callbacks = [];

return run();
while (ctx) {
callbacks = ctx._beforeNavigateCallbacks.concat(callbacks);
ctx = ctx.$child;
}

function run() {
var i = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];
return run(callbacks);

function run(callbacks) {
return new Promise(function (resolve) {
if (i === ctx._beforeNavigateCallbacks.length) {
if (callbacks.length === 0) {
return resolve(true);
}
var cb = ctx._beforeNavigateCallbacks[i];
var cb = callbacks.shift();
var recursiveResolve = function recursiveResolve() {
var shouldUpdate = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
return shouldUpdate ? run(++i).then(resolve) : resolve(false);
return shouldUpdate ? run(callbacks).then(resolve) : resolve(false);
};

if (cb.length === 1) {
cb(recursiveResolve);
} else {
var v = cb();
if ((0, _utils.isUndefined)(v) || typeof v.then !== 'function') {
resolve(v !== false);
recursiveResolve(v);
} else {
v.then(recursiveResolve);
}
Expand Down
20 changes: 13 additions & 7 deletions src/context.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,26 +149,32 @@ export default class Context {
}

runBeforeNavigateCallbacks() {
const ctx = this
let ctx = this
let callbacks = []

return run()
while (ctx) {
callbacks = ctx._beforeNavigateCallbacks.concat(callbacks)
ctx = ctx.$child
}

return run(callbacks)

function run(i = 0) {
function run(callbacks) {
return new Promise((resolve) => {
if (i === ctx._beforeNavigateCallbacks.length) {
if (callbacks.length === 0) {
return resolve(true)
}
const cb = ctx._beforeNavigateCallbacks[i]
const cb = callbacks.shift()
const recursiveResolve = (shouldUpdate = true) => shouldUpdate
? run(++i).then(resolve)
? run(callbacks).then(resolve)
: resolve(false)

if (cb.length === 1) {
cb(recursiveResolve)
} else {
const v = cb()
if (isUndefined(v) || typeof v.then !== 'function') {
resolve(v !== false)
recursiveResolve(v)
} else {
v.then(recursiveResolve)
}
Expand Down
38 changes: 33 additions & 5 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ import './src'
ko.options.deferUpdates = true

test('ko-component-router', async (t) => { // eslint-disable-line
const NUM_TESTS_PER_SUITE = 57
// const NUM_TESTS_PER_SUITE = 44
const NUM_TESTS_PER_SUITE = 60
const NUM_CONFIGS = 4
const NUM_TESTS = NUM_TESTS_PER_SUITE * NUM_CONFIGS + 4
t.plan(NUM_TESTS)
Expand Down Expand Up @@ -74,7 +73,7 @@ async function runTests(t, config) {
// persistQuery & persistState options
'/persistent/!': 'persistent-query-state',

'/navigate-callback': 'navigate-callback',
'/navigate-callback/!': 'navigate-callback',

// wildcard segment
'/*': '404'
Expand Down Expand Up @@ -341,13 +340,20 @@ async function runTests(t, config) {
})

// addBeforeNavigateCallback
let parentCallbackCalled
await step(() => {
ko.components.register('navigate-callback', {
template: '<div></div>',
template: '<ko-component-router params="routes: routes"></ko-component-router>',
viewModel: class {
constructor(ctx) {
this.routes = {
'/': 'empty-component',
'/nested-navigate-callback': 'nested-navigate-callback'
}

let isFirstTime = true
ctx.addBeforeNavigateCallback(() => {
parentCallbackCalled = true
if (isFirstTime) {
t.pass('functions registered with addBeforeNavigateCallback get called')
isFirstTime = false
Expand All @@ -357,7 +363,27 @@ async function runTests(t, config) {
}
}
})
router.update('/navigate-callback')
ko.components.register('nested-navigate-callback', {
template: '<div></div>',
viewModel: class {
constructor(ctx) {
let secondCallbackCalled
ctx.addBeforeNavigateCallback((done) => {
setTimeout(() => {
t.false(secondCallbackCalled, 'addBeforeNavigateCallbacks are ran FIFO and sequentially')
done()
}, 100)
})
ctx.addBeforeNavigateCallback(() => {
secondCallbackCalled = true
t.pass('functions registered with addBeforeNavigateCallback in child routers get called when the parent navigates')
t.false(parentCallbackCalled, 'addBeforeNavigateCallbacks in child routers get called first')
})
}
}
})
ko.components.register('empty-component', { template: '<span></span>' })
router.update('/navigate-callback/nested-navigate-callback')
})
await step((done) => {
const willUpdate = router.update('/about')
Expand All @@ -377,6 +403,8 @@ async function runTests(t, config) {
await step(() => {
t.equal(router.route().component, 'about', 'addBeforeNavigateCallback does not prevent navigation when return !== false')
ko.components.unregister('navigate-callback')
ko.components.unregister('nested-navigate-callback')
ko.components.unregister('empty-component')
})

// addBeforeNavigateCallback callback
Expand Down

0 comments on commit 02ad3c9

Please sign in to comment.