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;');
            });
        }
    };   
});