javascript - Hur man jämför med globala variabler i ng-switch
Jag använder AngularJS $rootScope-objektet för att exponera några globala konstanter som behöver vara åtkomliga för både controllers och vyer:
var app = angular.module('myApp', []);
app.run(function ($rootScope) {
$rootScope.myConstant = 2;
});
När jag försöker återge ett globalt värde i en vy fungerar det korrekt:
{{myConstant}}
På samma sätt, om jag refererar till det globala värdet i ett ng-if-villkor fungerar det också:
<span ng-if="someValue == myConstant">Conditional content</span>.
Men när man försöker använda samma värde för jämförelse inom ett ng-switch-block, utvärderas det aldrig till sant. Denna JSFiddle visar mitt försök att få detta att fungera. Jag har också försökt referera uttryckligen till det konstanta värdet som en medlem av $rootScope och som ett uttryck (inom dubbla måsvingar) men ingenting fungerar.
Några idéer om vad jag gör fel?
Tack,
Tim
Svar #1
Istället för att försöka sätta ng-switch-when, kan du anpassa ng-switch-on-uttrycket för att producera ett specifikt värde när myConstant är lika med 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>
Arbetande exempel.
Svar #2
Du kan alltid göra din egen... :)
(Inte säker på hur effektivt detta är och det är inte väl testat eftersom jag precis skrev det)
http://jsfiddle.net/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;');
});
}
};
});
