1
1
/**
2
- * angular-route-segment v1.0.3
2
+ * angular-route-segment v1.1.0
3
3
* https://angular-route-segment.com
4
4
* @author Artem Chivchalov
5
5
* @license MIT License http://opensource.org/licenses/MIT
@@ -145,7 +145,15 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
145
145
* Fully qualified name of current active route
146
146
* @type {string }
147
147
*/
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 ) ,
149
157
150
158
/**
151
159
* Array of segments splitted by each level separately. Each item contains the following properties:
@@ -180,8 +188,6 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
180
188
return false ;
181
189
}
182
190
} ;
183
-
184
- var lastParams = angular . copy ( $routeParams ) ;
185
191
186
192
var resolvingSemaphoreChain = { } ;
187
193
@@ -200,27 +206,37 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
200
206
var newSegment = getSegmentInChain ( i , segmentNameChain ) ;
201
207
202
208
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 &&
204
211
! isDependenciesChanged ( newSegment ) )
212
+ // if we went back to the same state as we were before resolving new segment
205
213
resolvingSemaphoreChain [ i ] = newSegment . name ;
206
- else */
214
+ else
207
215
updates . push ( updateSegment ( i , newSegment ) ) ;
208
216
}
209
217
}
210
218
211
- $q . all ( updates ) . then ( function ( ) {
219
+ $q . all ( updates ) . then ( function ( result ) {
212
220
213
221
$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
+ }
214
228
215
229
// Removing redundant segment in case if new segment chain is shorter than old one
216
230
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 ++ )
218
235
updateSegment ( i , null ) ;
219
- $routeSegment . chain . splice ( - 1 , $routeSegment . chain . length - segmentNameChain . length ) ;
220
236
}
221
237
} ) ;
222
238
223
- lastParams = angular . copy ( $routeParams ) ;
239
+
224
240
}
225
241
} ) ;
226
242
@@ -229,7 +245,7 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
229
245
var result = false ;
230
246
if ( segment . params . dependencies )
231
247
angular . forEach ( segment . params . dependencies , function ( name ) {
232
- if ( ! angular . equals ( lastParams [ name ] , $routeParams [ name ] ) )
248
+ if ( ! angular . equals ( $routeSegment . $routeParams [ name ] , $routeParams [ name ] ) )
233
249
result = true ;
234
250
} ) ;
235
251
return result ;
@@ -243,23 +259,25 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
243
259
244
260
if ( ! segment ) {
245
261
resolvingSemaphoreChain [ index ] = null ;
246
- $rootScope . $ broadcast( 'routeSegmentChange' , { index : index , segment : null } ) ;
262
+ broadcast ( index ) ;
247
263
return ;
248
264
}
249
265
250
266
resolvingSemaphoreChain [ index ] = segment . name ;
251
267
252
268
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 ) ;
256
274
} )
257
275
}
258
276
else
259
- return resolveAndBroadcast ( index , segment . name , segment . params ) ;
277
+ return resolve ( index , segment . name , segment . params ) ;
260
278
}
261
279
262
- function resolveAndBroadcast ( index , name , params ) {
280
+ function resolve ( index , name , params ) {
263
281
264
282
var locals = angular . extend ( { } , params . resolve ) ;
265
283
@@ -289,7 +307,10 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
289
307
params : params ,
290
308
locals : resolvedLocals ,
291
309
reload : function ( ) {
292
- updateSegment ( index , this ) ;
310
+ updateSegment ( index , this ) . then ( function ( result ) {
311
+ if ( result . success != undefined )
312
+ broadcast ( index ) ;
313
+ } )
293
314
}
294
315
} ;
295
316
@@ -316,23 +337,27 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
316
337
$routeSegment . chain [ index ] . reload ( ) ;
317
338
} )
318
339
}
319
-
320
- $rootScope . $broadcast ( 'routeSegmentChange' , {
321
- index : index ,
322
- segment : $routeSegment . chain [ index ] } ) ;
340
+
341
+ return { success : index } ;
323
342
} ,
324
343
325
344
function ( error ) {
326
345
327
346
if ( params . resolveFailed ) {
328
347
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 ) ) ;
330
349
}
331
350
else
332
351
throw new Error ( 'Resolving failed with a reason `' + error + '`, but no `resolveFailed` ' +
333
352
'provided for segment `' + name + '`' ) ;
334
353
} )
335
354
}
355
+
356
+ function broadcast ( index ) {
357
+ $rootScope . $broadcast ( 'routeSegmentChange' , {
358
+ index : index ,
359
+ segment : $routeSegment . chain [ index ] || null } ) ;
360
+ }
336
361
337
362
function getSegmentInChain ( segmentIdx , segmentNameChain ) {
338
363
@@ -417,6 +442,9 @@ angular.module( 'route-segment', [] ).provider( '$routeSegment',
417
442
}
418
443
catch ( e ) { }
419
444
445
+ if ( $routeSegment . chain [ viewSegmentIndex ] )
446
+ update ( $routeSegment . chain [ viewSegmentIndex ] ) ;
447
+
420
448
// Watching for the specified route segment and updating contents
421
449
$scope . $on ( 'routeSegmentChange' , function ( event , args ) {
422
450
if ( args . index == viewSegmentIndex )
0 commit comments