Skip to content

Commit cdbe087

Browse files
sbezkostnyichristopherthielen
authored andcommitted
feat(uiSrefActive): Added support for multiple nested uiSref directives
Conflicts: src/stateDirectives.ts test/stateDirectivesSpec.js
1 parent a71ad3c commit cdbe087

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

src/stateDirectives.ts

+29-9
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function $StateRefDirective($state, $timeout) {
104104

105105
var activeDirective = uiSrefActive[1] || uiSrefActive[0];
106106
if (activeDirective) {
107-
activeDirective.$$setStateInfo(ref.state, params);
107+
activeDirective.$$addStateInfo(ref.state, params);
108108
}
109109
if (newHref === null) {
110110
nav = false;
@@ -223,30 +223,50 @@ function $StateRefActiveDirective($state, $stateParams, $interpolate) {
223223
return {
224224
restrict: "A",
225225
controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) {
226-
var state, params, activeClass;
226+
var states = [], activeClass;
227227

228228
// There probably isn't much point in $observing this
229229
// uiSrefActive and uiSrefActiveEq share the same directive object with some
230230
// slight difference in logic routing
231231
activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope);
232232

233233
// Allow uiSref to communicate with uiSrefActive[Equals]
234-
this.$$setStateInfo = function(newState, newParams) {
235-
state = $state.get(newState, stateContext($element) || $state.$current);
236-
params = newParams;
237-
update();
234+
this.$$addStateInfo = function (newState, newParams) {
235+
var state = $state.get(newState, stateContext($element));
236+
if (state) {
237+
states.push({
238+
state: state,
239+
params: newParams
240+
});
241+
update();
242+
}
238243
};
239244

240245
$scope.$on('$stateChangeSuccess', update);
241246

242247
// Update route state
243248
function update() {
244-
$element[(isMatch() ? "add" : "remove") + "Class"](activeClass);
249+
if (anyMatch()) {
250+
$element.addClass(activeClass);
251+
} else {
252+
$element.removeClass(activeClass);
253+
}
254+
}
255+
256+
function anyMatch() {
257+
for (var i = 0; i < states.length; i++) {
258+
if (isMatch(states[i].state, states[i].params)) {
259+
return true;
260+
}
261+
}
262+
return false;
245263
}
246264

247-
function isMatch() {
265+
function isMatch(state, params) {
248266
if (typeof $attrs.uiSrefActiveEq !== 'undefined') {
249-
return $state.$current.self === state && matchesParams();
267+
return $state.is(state.name, params);
268+
} else {
269+
return $state.includes(state.name, params);
250270
}
251271
return $state.includes(state.name) && matchesParams();
252272
}

0 commit comments

Comments
 (0)