Skip to content

Commit a89114a

Browse files
committed
fix(uiSrefActive): allow multiple classes
Fixes #2481, #2482
1 parent 6ab4472 commit a89114a

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

src/stateDirectives.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,20 @@ function $StateRefActiveDirective($state, $stateParams, $interpolate) {
289289
return {
290290
restrict: "A",
291291
controller: ['$scope', '$element', '$attrs', '$timeout', function ($scope, $element, $attrs, $timeout) {
292-
var states = [], activeClasses = {}, activeEqClass;
292+
var states = [], activeClasses = {}, activeEqClass, uiSrefActive;
293293

294294
// There probably isn't much point in $observing this
295295
// uiSrefActive and uiSrefActiveEq share the same directive object with some
296296
// slight difference in logic routing
297297
activeEqClass = $interpolate($attrs.uiSrefActiveEq || '', false)($scope);
298298

299-
var uiSrefActive = $scope.$eval($attrs.uiSrefActive) || $interpolate($attrs.uiSrefActive || '', false)($scope);
299+
try {
300+
uiSrefActive = $scope.$eval($attrs.uiSrefActive);
301+
} catch (e) {
302+
// Do nothing. uiSrefActive is not a valid expression.
303+
// Fall back to using $interpolate below
304+
}
305+
uiSrefActive = uiSrefActive || $interpolate($attrs.uiSrefActive || '', false)($scope);
300306
if (isObject(uiSrefActive)) {
301307
forEach(uiSrefActive, function(stateOrName, activeClass) {
302308
if (isString(stateOrName)) {

test/stateDirectivesSpec.js

+11
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,17 @@ describe('uiSrefActive', function() {
635635
expect(angular.element(template[0].querySelector('a')).attr('class')).toBe('active');
636636
}));
637637

638+
it('should allow multiple classes to be supplied', inject(function($rootScope, $q, $compile, $state) {
639+
template = $compile('<div><a ui-sref="contacts.item({ id: 1 })" ui-sref-active="active also-active">Contacts</a></div>')($rootScope);
640+
$rootScope.$digest();
641+
var a = angular.element(template[0].getElementsByTagName('a')[0]);
642+
643+
$state.transitionTo('contacts.item.edit', { id: 1 });
644+
$q.flush();
645+
timeoutFlush();
646+
expect(a.attr('class')).toMatch(/active also-active/);
647+
}));
648+
638649
describe('ng-{class,style} interface', function() {
639650
it('should match on abstract states that are included by the current state', inject(function($rootScope, $compile, $state, $q) {
640651
el = $compile('<div ui-sref-active="{active: \'admin.*\'}"><a ui-sref-active="active" ui-sref="admin.roles">Roles</a></div>')($rootScope);

0 commit comments

Comments
 (0)