Skip to content

Commit 89d94f1

Browse files
committed
introduce new $routeSegment.$routeParams feature, various bug fixes
1 parent 2054814 commit 89d94f1

File tree

11 files changed

+149
-59
lines changed

11 files changed

+149
-59
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ Documentation
127127
128128
Please note that you may read the [test specs](https://github.com/artch/angular-route-segment/tree/master/test/unit) to learn features usage.
129129
130-
### $routeSegmentProvider ###
130+
### $routeSegmentProvider properties ###
131131
132132
**options**
133133
@@ -190,12 +190,17 @@ Traverses up in the tree.
190190
191191
Traverses to the root.
192192
193-
### $routeSegment ###
193+
### $routeSegment properties ###
194194
195195
**name**
196196
197197
Fully qualified name of current active route.
198198
199+
**$routeParams**
200+
201+
A copy of `$routeParams` in its state of the latest successful segment update. It may be not equal to `$routeParams`
202+
while some resolving is not completed yet. Should be used instead of original `$routeParams` in most cases.
203+
199204
**chain**
200205
201206
An array of segments splitted by each level separately. Each item contains the following properties:

build/angular-route-segment.js

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* angular-route-segment v1.0.3
2+
* angular-route-segment v1.1.0
33
* https://angular-route-segment.com
44
* @author Artem Chivchalov
55
* @license MIT License http://opensource.org/licenses/MIT
@@ -145,7 +145,15 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
145145
* Fully qualified name of current active route
146146
* @type {string}
147147
*/
148-
name: '',
148+
name: '',
149+
150+
/**
151+
* A copy of `$routeParams` in its state of the latest successful segment update. It may be not equal
152+
* to `$routeParams` while some resolving is not completed yet. Should be used instead of original
153+
* `$routeParams` in most cases.
154+
* @type {Object}
155+
*/
156+
$routeParams: angular.copy($routeParams),
149157

150158
/**
151159
* Array of segments splitted by each level separately. Each item contains the following properties:
@@ -180,8 +188,6 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
180188
return false;
181189
}
182190
};
183-
184-
var lastParams = angular.copy($routeParams);
185191

186192
var resolvingSemaphoreChain = {};
187193

@@ -200,27 +206,37 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
200206
var newSegment = getSegmentInChain( i, segmentNameChain );
201207

202208
if(resolvingSemaphoreChain[i] != newSegment.name || isDependenciesChanged(newSegment)) {
203-
/*if($routeSegment.chain[i] && $routeSegment.chain[i].name == newSegment.name &&
209+
210+
if($routeSegment.chain[i] && $routeSegment.chain[i].name == newSegment.name &&
204211
!isDependenciesChanged(newSegment))
212+
// if we went back to the same state as we were before resolving new segment
205213
resolvingSemaphoreChain[i] = newSegment.name;
206-
else */
214+
else
207215
updates.push(updateSegment(i, newSegment));
208216
}
209217
}
210218

211-
$q.all(updates).then(function() {
219+
$q.all(updates).then(function(result) {
212220

213221
$routeSegment.name = segmentName;
222+
$routeSegment.$routeParams = angular.copy($routeParams);
223+
224+
for(var i=0; i < result.length; i++) {
225+
if(result[i].success != undefined)
226+
broadcast(result[i].success);
227+
}
214228

215229
// Removing redundant segment in case if new segment chain is shorter than old one
216230
if($routeSegment.chain.length > segmentNameChain.length) {
217-
for(var i=segmentNameChain.length; i < $routeSegment.chain.length; i++)
231+
var oldLength = $routeSegment.chain.length;
232+
var shortenBy = $routeSegment.chain.length - segmentNameChain.length;
233+
$routeSegment.chain.splice(-shortenBy, shortenBy);
234+
for(var i=segmentNameChain.length; i < oldLength; i++)
218235
updateSegment(i, null);
219-
$routeSegment.chain.splice(-1, $routeSegment.chain.length - segmentNameChain.length);
220236
}
221237
});
222238

223-
lastParams = angular.copy($routeParams);
239+
224240
}
225241
});
226242

@@ -229,7 +245,7 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
229245
var result = false;
230246
if(segment.params.dependencies)
231247
angular.forEach(segment.params.dependencies, function(name) {
232-
if(!angular.equals(lastParams[name], $routeParams[name]))
248+
if(!angular.equals($routeSegment.$routeParams[name], $routeParams[name]))
233249
result = true;
234250
});
235251
return result;
@@ -243,23 +259,25 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
243259

244260
if(!segment) {
245261
resolvingSemaphoreChain[index] = null;
246-
$rootScope.$broadcast( 'routeSegmentChange', { index: index, segment: null } );
262+
broadcast(index);
247263
return;
248264
}
249265

250266
resolvingSemaphoreChain[index] = segment.name;
251267

252268
if(segment.params.untilResolved) {
253-
return resolveAndBroadcast(index, segment.name, segment.params.untilResolved)
254-
.then(function() {
255-
resolveAndBroadcast(index, segment.name, segment.params);
269+
return resolve(index, segment.name, segment.params.untilResolved)
270+
.then(function(result) {
271+
if(result.success != undefined)
272+
broadcast(index);
273+
return resolve(index, segment.name, segment.params);
256274
})
257275
}
258276
else
259-
return resolveAndBroadcast(index, segment.name, segment.params);
277+
return resolve(index, segment.name, segment.params);
260278
}
261279

262-
function resolveAndBroadcast(index, name, params) {
280+
function resolve(index, name, params) {
263281

264282
var locals = angular.extend({}, params.resolve);
265283

@@ -289,7 +307,10 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
289307
params: params,
290308
locals: resolvedLocals,
291309
reload: function() {
292-
updateSegment(index, this);
310+
updateSegment(index, this).then(function(result) {
311+
if(result.success != undefined)
312+
broadcast(index);
313+
})
293314
}
294315
};
295316

@@ -316,23 +337,27 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
316337
$routeSegment.chain[index].reload();
317338
})
318339
}
319-
320-
$rootScope.$broadcast( 'routeSegmentChange', {
321-
index: index,
322-
segment: $routeSegment.chain[index] } );
340+
341+
return {success: index};
323342
},
324343

325344
function(error) {
326345

327346
if(params.resolveFailed) {
328347
var newResolve = {error: function() { return $q.when(error); }};
329-
resolveAndBroadcast(index, name, angular.extend({resolve: newResolve}, params.resolveFailed));
348+
return resolve(index, name, angular.extend({resolve: newResolve}, params.resolveFailed));
330349
}
331350
else
332351
throw new Error('Resolving failed with a reason `'+error+'`, but no `resolveFailed` ' +
333352
'provided for segment `'+name+'`');
334353
})
335354
}
355+
356+
function broadcast(index) {
357+
$rootScope.$broadcast( 'routeSegmentChange', {
358+
index: index,
359+
segment: $routeSegment.chain[index] || null } );
360+
}
336361

337362
function getSegmentInChain(segmentIdx, segmentNameChain) {
338363

@@ -417,6 +442,9 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
417442
}
418443
catch(e) {}
419444

445+
if($routeSegment.chain[viewSegmentIndex])
446+
update($routeSegment.chain[viewSegmentIndex]);
447+
420448
// Watching for the specified route segment and updating contents
421449
$scope.$on('routeSegmentChange', function(event, args) {
422450
if(args.index == viewSegmentIndex)

build/angular-route-segment.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/app.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,25 +166,22 @@ function MainCtrl($scope, $routeSegment, loader) {
166166
})
167167
}
168168

169-
function Section1Ctrl($scope, $routeSegment, $routeParams) {
169+
function Section1Ctrl($scope, $routeSegment) {
170170

171171
$scope.$routeSegment = $routeSegment;
172-
$scope.$routeParams = $routeParams;
173172
$scope.test = { btnClicked: false };
174173
$scope.items = [ 1,2,3,4,5 ];
175174
}
176175

177-
function Section1ItemCtrl($scope, $routeSegment, $routeParams) {
178-
179-
$scope.$routeParams = $routeParams;
176+
function Section1ItemCtrl($scope, $routeSegment) {
177+
180178
$scope.$routeSegment = $routeSegment;
181-
$scope.item = { id: $routeParams.id };
179+
$scope.item = { id: $routeSegment.$routeParams.id };
182180
$scope.test = { textValue: '' };
183181
}
184182

185-
function Section2Ctrl($scope, $routeSegment, $routeParams) {
186-
187-
$scope.$routeParams = $routeParams;
183+
function Section2Ctrl($scope, $routeSegment) {
184+
188185
$scope.$routeSegment = $routeSegment;
189186
$scope.test = { textValue: '' };
190187
$scope.items = [ 1,2,3,4,5,6,7,8,9 ];

example/templates/section1.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<li class="nav-header">Items</li>
99

1010
<li ng-repeat="i in items"
11-
ng-class="{active: $routeSegment.startsWith('s1.itemInfo') && $routeParams.id == i}">
11+
ng-class="{active: $routeSegment.startsWith('s1.itemInfo') && $routeSegment.$routeParams.id == i}">
1212

1313
<a ng-href="#/section1/{{i}}">Item {{i}}</a>
1414

example/templates/section2.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ <h2>Section 2</h2>
88
<ul class="nav nav-pills">
99

1010
<li ng-repeat="i in items"
11-
ng-class="{active: $routeParams.id==i}">
11+
ng-class="{active: $routeSegment.$routeParams.id==i}">
1212

1313
<a ng-href="#/section2/{{i}}">Item {{i}}</a>
1414

example/templates/section2/item.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Item {{$routeParams.id}} contents.
1+
Item {{$routeSegment.$routeParams.id}} contents.

0 commit comments

Comments
 (0)