2013-09-03 23 views
6

Używam angularjs $rootScope obiektu, aby odsłonić pewne zmienne globalne, które powinny być dostępne dla obu kontrolerów i widoków:Jak porównać przeciwko zmiennych globalnych w ng-switch

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

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

Gdy próbuję uczynić globalną wartość w widoku, to działa prawidłowo:

{{myConstant}} 

Podobnie, jeśli odwołać się do wartości globalnej w warunkach ng-if działa również:

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

Jednak przy próbie użycia tej samej wartości do porównania w bloku ng-switch, nigdy nie jest równa true. This JSFiddle demonstruje moją próbę uzyskania tego działa. Próbowałem również jawnie odwoływać się do stałej wartości jako członek $rootScope i jako wyrażenie (wewnątrz podwójnych nawiasów klamrowych), ale nic nie działa.

Jakieś pomysły, co robię źle?

Dzięki,

Tim

+1

Nie wygląda na to, że działa tak z dyrektywą ng-switch. Inni poczynili podobne uwagi. Oto kolejny jsfiddle, który znalazłem, który podkreśla problem: http://jsfiddle.net/sfqGB/ –

+0

Wygląda na to, że nie można mieć dynamicznego 'ng-switch-when'. Alternatywnie możesz użyć 'ngIf'. – AlwaysALearner

Odpowiedz

1

Można zawsze toczyć własną rękę ... :)

(nie wiem, jak skuteczne jest to i nie jest dobrze przetestowane jak ja przed chwilą napisałem)

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

Dzięki - wygląda na to, że działa naprawdę dobrze. –

5

Zamiast próbować ustawić ng-switch-when, można dostosować ng-switch-on ekspresji w celu wytworzenia określonej wartości, gdy myConstant równa 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.

+0

To interesujące podejście i na pewno działa mój oryginalny przykład, ale czy nie jest to po prostu inny sposób tworzenia warunku "jeśli"? Moim prawdziwym celem jest użycie przełącznika Ng, aby przełączać się pomiędzy wieloma różnymi stałymi wartościami. Czy można dostosować składnię, aby to wspierać? –

+1

Prawdopodobnie uruchomiłbym funkcję włączania, która wykona wtedy to samo zadanie co wyrażenie. Sprawdź zmodyfikowany przykład http://jsfiddle.net/MmCUr/11/ z wieloma stałymi. –

+0

Zastanawiam się, dlaczego to nie działa, przynajmniej z najnowszą stabilną wersją kątową 1.2.2. Patrząc na kątowy kod źródłowy, widzę, co następuje: ** ng-if ** obserwuje zakres wstrzyknięty w jego funkcję łącza. ** ng-switch ** obserwuje zakres wstrzyknięty w funkcję łącza. W związku z tym, że ** $ rootScope ** jest dostępne dla wszystkich innych pochodnych zakresów, oba powinny rozwiązać swoje zmienne wyrażenia w tym samym kontekście. – angabriel