@@ -10,17 +10,18 @@ import { IAugmentedJQuery, ITimeoutService, IScope, IInterpolateService } from "
10
10
11
11
import {
12
12
Obj , extend , forEach , tail , isString , isObject , parse , noop , unnestR , identity , uniqR , inArray , removeFrom ,
13
- RawParams , PathNode , StateOrName , StateService , TransitionService , StateDeclaration , UIRouter
13
+ RawParams , PathNode , StateOrName , StateService , StateDeclaration , UIRouter
14
14
} from "ui-router-core" ;
15
15
import { UIViewData } from "./viewDirective" ;
16
16
17
17
/** @hidden */
18
- function parseStateRef ( ref : string , current : string ) {
19
- let preparsed = ref . match ( / ^ \s * ( { [ ^ } ] * } ) \s * $ / ) , parsed ;
20
- if ( preparsed ) ref = current + '(' + preparsed [ 1 ] + ')' ;
21
- parsed = ref . replace ( / \n / g, " " ) . match ( / ^ ( [ ^ ( ] + ?) \s * ( \( ( .* ) \) ) ? $ / ) ;
18
+ function parseStateRef ( ref : string ) {
19
+ let paramsOnly = ref . match ( / ^ \s * ( { [ ^ } ] * } ) \s * $ / ) , parsed ;
20
+ if ( paramsOnly ) ref = '(' + paramsOnly [ 1 ] + ')' ;
21
+
22
+ parsed = ref . replace ( / \n / g, " " ) . match ( / ^ \s * ( [ ^ ( ] * ?) \s * ( \( ( .* ) \) ) ? \s * $ / ) ;
22
23
if ( ! parsed || parsed . length !== 4 ) throw new Error ( "Invalid state ref '" + ref + "'" ) ;
23
- return { state : parsed [ 1 ] , paramExpr : parsed [ 3 ] || null } ;
24
+ return { state : parsed [ 1 ] || null , paramExpr : parsed [ 3 ] || null } ;
24
25
}
25
26
26
27
/** @hidden */
@@ -57,7 +58,8 @@ function clickHook(el: IAugmentedJQuery, $state: StateService, $timeout: ITimeou
57
58
if ( ! ( button > 1 || e . ctrlKey || e . metaKey || e . shiftKey || el . attr ( 'target' ) ) ) {
58
59
// HACK: This is to allow ng-clicks to be processed before the transition is initiated:
59
60
var transition = $timeout ( function ( ) {
60
- $state . go ( target . uiState , target . uiStateParams , target . uiStateOpts ) ;
61
+ let state = target . uiState || $state . current ;
62
+ $state . go ( state , target . uiStateParams , target . uiStateOpts ) ;
61
63
} ) ;
62
64
e . preventDefault ( ) ;
63
65
@@ -150,21 +152,22 @@ let uiSref = ['$uiRouter', '$timeout',
150
152
restrict : 'A' ,
151
153
require : [ '?^uiSrefActive' , '?^uiSrefActiveEq' ] ,
152
154
link : function ( scope : IScope , element : IAugmentedJQuery , attrs : any , uiSrefActive : any ) {
153
- var ref = parseStateRef ( attrs . uiSref , $state . current . name ) ;
154
- var def = { uiState : ref . state } as Def ;
155
+ var ref = parseStateRef ( attrs . uiSref ) ;
155
156
var type = getTypeInfo ( element ) ;
156
157
var active = uiSrefActive [ 1 ] || uiSrefActive [ 0 ] ;
157
158
var unlinkInfoFn : Function = null ;
158
159
var hookFn ;
159
160
161
+ var def = { uiState : ref . state } as Def ;
160
162
def . uiStateOpts = extend ( defaultOpts ( element , $state ) , attrs . uiSrefOpts ? scope . $eval ( attrs . uiSrefOpts ) : { } ) ;
161
163
162
164
var update = function ( val ?: any ) {
163
165
if ( val ) def . uiStateParams = angular . copy ( val ) ;
164
- def . href = $state . href ( ref . state , def . uiStateParams , def . uiStateOpts ) ;
166
+ let state = def . uiState || $uiRouter . globals . current ;
167
+ def . href = $state . href ( state , def . uiStateParams , def . uiStateOpts ) ;
165
168
166
169
if ( unlinkInfoFn ) unlinkInfoFn ( ) ;
167
- if ( active ) unlinkInfoFn = active . $$addStateInfo ( ref . state , def . uiStateParams ) ;
170
+ if ( active ) unlinkInfoFn = active . $$addStateInfo ( state , def . uiStateParams ) ;
168
171
if ( def . href !== null ) attrs . $set ( type . attr , def . href ) ;
169
172
} ;
170
173
@@ -177,6 +180,7 @@ let uiSref = ['$uiRouter', '$timeout',
177
180
update ( ) ;
178
181
179
182
scope . $on ( '$destroy' , < any > $uiRouter . stateRegistry . onStatesChanged ( ( ) => update ( ) ) ) ;
183
+ scope . $on ( '$destroy' , < any > $uiRouter . transitionService . onSuccess ( { } , ( ) => update ( ) ) ) ;
180
184
181
185
if ( ! type . clickable ) return ;
182
186
hookFn = clickHook ( element , $state , $timeout , type , function ( ) {
@@ -239,10 +243,11 @@ let uiState = ['$uiRouter', '$timeout',
239
243
var hookFn ;
240
244
241
245
function update ( ) {
242
- def . href = $state . href ( def . uiState , def . uiStateParams , def . uiStateOpts ) ;
246
+ let state = def . uiState || $uiRouter . globals . current ;
247
+ def . href = $state . href ( state , def . uiStateParams , def . uiStateOpts ) ;
243
248
244
249
if ( unlinkInfoFn ) unlinkInfoFn ( ) ;
245
- if ( active ) unlinkInfoFn = active . $$addStateInfo ( def . uiState , def . uiStateParams ) ;
250
+ if ( active ) unlinkInfoFn = active . $$addStateInfo ( state , def . uiStateParams ) ;
246
251
if ( def . href ) attrs . $set ( type . attr , def . href ) ;
247
252
}
248
253
@@ -259,6 +264,7 @@ let uiState = ['$uiRouter', '$timeout',
259
264
} ) ;
260
265
261
266
scope . $on ( '$destroy' , < any > $uiRouter . stateRegistry . onStatesChanged ( ( ) => update ( ) ) ) ;
267
+ scope . $on ( '$destroy' , < any > $uiRouter . transitionService . onSuccess ( { } , ( ) => update ( ) ) ) ;
262
268
update ( ) ;
263
269
264
270
if ( ! type . clickable ) return ;
@@ -360,7 +366,7 @@ let uiSrefActive = ['$state', '$stateParams', '$interpolate', '$uiRouter',
360
366
restrict : "A" ,
361
367
controller : [ '$scope' , '$element' , '$attrs' ,
362
368
function ( $scope : IScope , $element : IAugmentedJQuery , $attrs : any ) {
363
- var states : StateData [ ] = [ ] ,
369
+ let states : StateData [ ] = [ ] ,
364
370
activeEqClass : string ,
365
371
uiSrefActive : any ;
366
372
@@ -379,7 +385,7 @@ let uiSrefActive = ['$state', '$stateParams', '$interpolate', '$uiRouter',
379
385
if ( isObject ( uiSrefActive ) ) {
380
386
forEach ( uiSrefActive , function ( stateOrName : StateOrName , activeClass : string ) {
381
387
if ( isString ( stateOrName ) ) {
382
- var ref = parseStateRef ( stateOrName , $state . current . name ) ;
388
+ let ref = parseStateRef ( stateOrName ) ;
383
389
addState ( ref . state , $scope . $eval ( ref . paramExpr ) , activeClass ) ;
384
390
}
385
391
} ) ;
@@ -392,7 +398,7 @@ let uiSrefActive = ['$state', '$stateParams', '$interpolate', '$uiRouter',
392
398
if ( isObject ( uiSrefActive ) && states . length > 0 ) {
393
399
return ;
394
400
}
395
- var deregister = addState ( newState , newParams , uiSrefActive ) ;
401
+ let deregister = addState ( newState , newParams , uiSrefActive ) ;
396
402
update ( ) ;
397
403
return deregister ;
398
404
} ;
0 commit comments