Skip to content

Commit 4644b42

Browse files
committed
Added ability to queue up children and register them once their parent is registered
1 parent 36321d3 commit 4644b42

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

src/state.js

+23-1
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;
4+
var root, states = {}, $state, queue = [];
55

66
// Builds state properties from definition passed to registerState()
77
var stateBuilder = {
@@ -143,6 +143,13 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
143143
return undefined;
144144
}
145145

146+
function queueState(parentName, state) {
147+
if (!queue[parentName]) {
148+
queue[parentName] = [];
149+
}
150+
151+
queue[parentName].push(state);
152+
}
146153

147154
function registerState(state) {
148155
// Wrap a new object around the state so we can store our private details easily.
@@ -156,6 +163,14 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
156163
if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
157164
if (states[name]) throw new Error("State '" + name + "'' is already defined");
158165

166+
// 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+
}
172+
}
173+
159174
for (var key in stateBuilder) {
160175
if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
161176
}
@@ -170,6 +185,13 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
170185
}]);
171186
}
172187

188+
// Register any queued children
189+
if (queue[name]) {
190+
for (var i = 0; i < queue[name].length; i++) {
191+
registerState(queue[name][i]);
192+
}
193+
}
194+
173195
return state;
174196
}
175197

test/stateSpec.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ describe('state', function () {
2525
E = { params: [ 'i' ] },
2626
H = { data: {propA: 'propA', propB: 'propB'} },
2727
HH = { parent: H },
28-
HHH = {parent: HH, data: {propA: 'overriddenA', propC: 'propC'} }
28+
HHH = {parent: HH, data: {propA: 'overriddenA', propC: 'propC'} },
29+
J = {},
30+
JJ = {},
2931
AppInjectable = {};
3032

3133
beforeEach(module(function ($stateProvider, $provide) {
@@ -45,6 +47,8 @@ describe('state', function () {
4547
.state('H', H)
4648
.state('HH', HH)
4749
.state('HHH', HHH)
50+
.state('JJ.J', J)
51+
.state('JJ', JJ)
4852

4953
.state('home', { url: "/" })
5054
.state('home.item', { url: "front/:id" })
@@ -87,7 +91,6 @@ describe('state', function () {
8791
expect($state.current).toBe(state);
8892
}
8993

90-
9194
describe('.transitionTo()', function () {
9295
it('returns a promise for the target state', inject(function ($state, $q) {
9396
var trans = $state.transitionTo(A, {});
@@ -539,6 +542,8 @@ describe('state', function () {
539542
'H',
540543
'HH',
541544
'HHH',
545+
'JJ',
546+
'JJ.J',
542547
'about',
543548
'about.person',
544549
'about.person.item',

0 commit comments

Comments
 (0)