最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to compare against global variables in ng-switch - Stack Overflow

programmeradmin1浏览0评论

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 use ngIf. – AlwaysALearner Commented Sep 3, 2013 at 15:11
Add a ment  | 

2 Answers 2

Reset to default 5

Instead 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;');
            });
        }
    };   
});
发布评论

评论列表(0)

  1. 暂无评论