2013-09-03 7 views
6

ich den AngularJS $rootScope Objekt verwenden einige globalen Konstanten zu machen, die beide zu Controllern und Ansichten zugänglich sein müssen:Wie gegen die globalen Variablen in ng-Schalter vergleichen

var app = angular.module('myApp', []); 

app.run(function ($rootScope) { 
    $rootScope.myConstant = 2; 
}); 

Wenn ich ein globalen zu machen versuchen, Wert in einer Ansicht, es funktioniert einwandfrei:

{{myConstant}} 

Ebenso, wenn ich den globalen Wert in einem ng-if Zustand Referenz funktioniert es auch:

<span ng-if="someValue == myConstant">Conditional content</span>. 

Wenn jedoch versucht wird, denselben Wert für den Vergleich innerhalb eines ng-switch Blocks zu verwenden, wird der Wert nie als wahr ausgewertet. This JSFiddle zeigt meinen Versuch, das funktioniert zu bekommen. Ich habe auch versucht, explizit auf den konstanten Wert als Mitglied von $rootScope und als Ausdruck (innerhalb von geschweiften Klammern) zu verweisen, aber nichts funktioniert.

Irgendwelche Ideen, was ich falsch mache?

Danke,

Tim

+1

Es sieht nicht so aus, als ob es mit der ng-switch Direktive funktioniert. Andere haben ähnliche Kommentare abgegeben. Hier ist ein weiteres Beispiel, das ich gefunden habe, das das Problem hervorhebt: http://jsfiddle.net/sfqGB/ –

+0

Es scheint, dass Sie ab jetzt kein dynamisches 'ng-switch-when' haben können. Alternativ können Sie 'ngIf' verwenden. – AlwaysALearner

Antwort

1

Sie können immer Ihre eigene Rolle ... :)

(nicht sicher, wie effizient das ist und es ist nicht gut getestet, wie ich es gerade jetzt geschrieben)

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

Danke - das scheint wirklich gut zu funktionieren. –

5

Anstatt zu versuchen, ng-switch-when zu setzen, Sie ng-switch-on Ausdruck, um anpassen können bestimmten Wert zu erzeugen, wenn myConstantitem.value gleich:

<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.

+0

Dies ist ein interessanter Ansatz, und es lässt mein ursprüngliches Beispiel sicherlich funktionieren, aber ist das nicht eine andere Art, eine "if" Bedingung zu erstellen? Mein Ziel ist es, mit Hilfe von ng-switch zwischen verschiedenen konstanten Werten zu wechseln. Ist es möglich, Ihre Syntax anzupassen, um dies zu unterstützen? –

+1

Ich würde wahrscheinlich Switch-on-Funktion ausführen, die den gleichen Job als Ausdruck dann tun wird. Sehen Sie sich das modifizierte Beispiel http://jsfiddle.net/MmCUr/11/ mit mehreren Konstanten an. –

+0

Ich frage mich, warum das nicht funktioniert, zumindest mit dem neuesten stabilen eckigen Release 1.2.2. Wenn ich mir den eckigen Quellcode anschaue, sehe ich folgendes: ** ng-if ** überwacht das in seiner Link-Funktion injizierte Oszilloskop. ** ng-switch ** überwacht das in seine Link-Funktion injizierte Oszilloskop. Wenn also der ** $ rootScope ** für alle anderen abgeleiteten Bereiche verfügbar ist, sollten beide ihre Ausdrucksvariablen im selben Kontext auflösen. – angabriel