Skip to content

Commit 104494e

Browse files
committed
Updated queue to work when parent is declared as a property on the state. Added test for cross-module implementation.
1 parent 4644b42 commit 104494e

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

src/state.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];
22
function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $locationProvider) {
33

4-
var root, states = {}, $state, queue = [];
4+
var root, states = {}, $state, queue = {};
55

66
// Builds state properties from definition passed to registerState()
77
var stateBuilder = {
@@ -163,12 +163,15 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
163163
if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
164164
if (states[name]) throw new Error("State '" + name + "'' is already defined");
165165

166+
// Get parent name
167+
var parentName =
168+
(name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
169+
: (isString(state.parent)) ? state.parent
170+
: '';
171+
166172
// If parent is not registered yet, add state to queue and register later
167-
if (name.indexOf('.') !== -1) {
168-
var parentName = name.substring(0, name.lastIndexOf('.'));
169-
if (!states[parentName]) {
170-
return queueState(parentName, state.self);
171-
}
173+
if (parentName && !states[parentName]) {
174+
return queueState(parentName, state.self);
172175
}
173176

174177
for (var key in stateBuilder) {

test/stateSpec.js

+35-6
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ describe('state', function () {
2626
H = { data: {propA: 'propA', propB: 'propB'} },
2727
HH = { parent: H },
2828
HHH = {parent: HH, data: {propA: 'overriddenA', propC: 'propC'} },
29-
J = {},
30-
JJ = {},
3129
AppInjectable = {};
3230

3331
beforeEach(module(function ($stateProvider, $provide) {
@@ -47,8 +45,6 @@ describe('state', function () {
4745
.state('H', H)
4846
.state('HH', HH)
4947
.state('HHH', HHH)
50-
.state('JJ.J', J)
51-
.state('JJ', JJ)
5248

5349
.state('home', { url: "/" })
5450
.state('home.item', { url: "front/:id" })
@@ -542,8 +538,6 @@ describe('state', function () {
542538
'H',
543539
'HH',
544540
'HHH',
545-
'JJ',
546-
'JJ.J',
547541
'about',
548542
'about.person',
549543
'about.person.item',
@@ -721,3 +715,38 @@ describe('state', function () {
721715

722716
});
723717
});
718+
719+
describe('state queue', function(){
720+
angular.module('ui.router.queue.test', ['ui.router.queue.test.dependency'])
721+
.config(function($stateProvider) {
722+
$stateProvider
723+
.state('queue-test-a', {})
724+
.state('queue-test-b-child', { parent: 'queue-test-b' })
725+
.state('queue-test-b', {});
726+
});
727+
angular.module('ui.router.queue.test.dependency', [])
728+
.config(function($stateProvider) {
729+
$stateProvider
730+
.state('queue-test-a.child', {})
731+
});
732+
733+
var expectedStates = ['','queue-test-a', 'queue-test-a.child', 'queue-test-b', 'queue-test-b-child'];
734+
735+
it('should work across modules', function() {
736+
module('ui.router.queue.test', 'ui.router.queue.test.dependency');
737+
738+
inject(function ($state) {
739+
var list = $state.get().sort(function(a, b) { return (a.name > b.name) - (b.name > a.name); });
740+
expect(list.map(function(state) { return state.name; })).toEqual(expectedStates);
741+
});
742+
});
743+
744+
it('should work when parent is name string', function() {
745+
module('ui.router.queue.test', 'ui.router.queue.test.dependency');
746+
747+
inject(function ($state) {
748+
var list = $state.get().sort(function(a, b) { return (a.name > b.name) - (b.name > a.name); });
749+
expect(list.map(function(state) { return state.name; })).toEqual(expectedStates);
750+
});
751+
});
752+
});

0 commit comments

Comments
 (0)