I am using the AngularJS $rootScope
object to expose some global constants that need to be accessible to both controllers and views:
var app = angular.module('myApp', []);
app.run(function ($rootScope) {
$rootScope.myConstant = 2;
});
When I attempt to render a global value in a view, it works correctly:
{{myConstant}}
Equally, if I reference the global value in an ng-if
condition it also works:
<span ng-if="someValue == myConstant">Conditional content</span>.
But, when attempting to use the same value for parison within an ng-switch
block, it never evaluates to true. This JSFiddle demonstrates my attempt to get this working. I have also tried explicitly referencing the constant value as a member of $rootScope
and as an expression (inside double curly braces) but nothing works.
Any ideas what I'm doing wrong?
Thanks,
Tim
I am using the AngularJS $rootScope
object to expose some global constants that need to be accessible to both controllers and views:
var app = angular.module('myApp', []);
app.run(function ($rootScope) {
$rootScope.myConstant = 2;
});
When I attempt to render a global value in a view, it works correctly:
{{myConstant}}
Equally, if I reference the global value in an ng-if
condition it also works:
<span ng-if="someValue == myConstant">Conditional content</span>.
But, when attempting to use the same value for parison within an ng-switch
block, it never evaluates to true. This JSFiddle demonstrates my attempt to get this working. I have also tried explicitly referencing the constant value as a member of $rootScope
and as an expression (inside double curly braces) but nothing works.
Any ideas what I'm doing wrong?
Thanks,
Tim
Share Improve this question edited Jan 10, 2014 at 11:10 Klaster_1 Нет войне 12.2k9 gold badges64 silver badges75 bronze badges asked Sep 3, 2013 at 14:20 Tim CoulterTim Coulter 8,95711 gold badges68 silver badges95 bronze badges 2- 1 Doesn't look like it works like that with the ng-switch directive. Others have made similar ments. Here's another jsfiddle that I found that highlights the issue: jsfiddle/sfqGB – Arthur Frankel Commented Sep 3, 2013 at 14:31
-
It seems as of now you cannot have a dynamic
ng-switch-when
. Alternatively, you can usengIf
. – AlwaysALearner Commented Sep 3, 2013 at 15:11
2 Answers
Reset to default 5Instead of trying to set ng-switch-when
, you can customize ng-switch-on
expression in order to produce specific value when myConstant
equals item.value
:
<span ng-switch on="{true:'const', false: item.value}[myConstant == item.value]">
<span ng-switch-when="const">
<span class="blue">{{item.name}}</span> (emphasis applied by ng-switch)
</span>
<span ng-switch-when="4">
<span class="red">{{item.name}}</span> (emphasis applied by ng-switch)
</span>
<span ng-switch-default>
{{item.name}}
</span>
</span>
Working example.
You could always roll your own... :)
(Not sure how efficient this is and it's not well-tested as I just now wrote it)
http://jsfiddle/H45zJ/1/
app.directive('wljSwitch', function () {
return {
controller: function ($scope) {
var _value;
this.getValue = function () {
return _value;
};
this.setValue = function (value) {
_value = value;
};
var _whensCount = 0;
this.addWhen = function (value) {
_whensCount++;
}
this.removeWhen = function (value) {
_whensCount--;
}
this.hasWhens = function () {
return _whensCount < -1;
};
},
link: function (scope, element, attrs, controller) {
scope.$watch(function () {
return scope.$eval(attrs.wljSwitchOn);
}, function (value) {
controller.setValue(value);
});
}
};
});
app.directive('wljSwitchWhen', function () {
return {
require: '^wljSwitch',
template: '<span ng-transclude></span>',
transclude: true,
replace: true,
link: function (scope, element, attrs, controller) {
scope.$watch(function () {
return controller.getValue() === scope.$eval(attrs.wljSwitchWhen);
}, function (value) {
if (value) {
controller.addWhen();
} else {
controller.removeWhen();
}
element.attr('style', value ? '' : 'display:none;');
});
}
};
});
app.directive('wljSwitchDefault', function () {
return {
require: '^wljSwitch',
template: '<span ng-transclude></span>',
transclude: true,
replace: true,
link: function (scope, element, attrs, controller) {
scope.$watch(controller.hasWhens, function (value) {
element.attr('style', value ? '' : 'display:none;');
});
}
};
});