2013-09-03 21 views
6

Sto usando l'AngularJS $rootScope oggetto da esporre alcune costanti globali che devono essere accessibili a entrambi i controller e le viste:Come confrontare con le variabili globali in ng-switch

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

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

Quando si tenta di rendere un globale valore in una vista, funziona correttamente:

{{myConstant}} 

Analogamente, se riferimento al valore globale in una condizione ng-if funziona anche:

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

Tuttavia, quando si tenta di utilizzare lo stesso valore per il confronto all'interno di un blocco ng-switch, non viene mai valutato true. This JSFiddle dimostra il mio tentativo di farlo funzionare. Ho anche provato a fare riferimento esplicitamente al valore costante come membro di $rootScope e come espressione (all'interno di doppie parentesi graffe) ma non funziona.

Qualche idea su cosa sto facendo male?

Grazie,

Tim

+1

Non sembra che funzioni così con la direttiva ng-switch. Altri hanno fatto commenti simili. Ecco un altro jsfiddle che ho trovato che evidenzia il problema: http://jsfiddle.net/sfqGB/ –

+0

Sembra che al momento non sia possibile avere un 'ng-switch-when dinamico '. In alternativa, puoi usare 'ngIf'. – AlwaysALearner

risposta

1

Si può sempre rotolare il proprio ... :)

(non so come efficace questo è e non è ben collaudato, come ho appena scritto)

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

Grazie - sembra funzionare molto bene. –

5

Invece di cercare di impostare ng-switch-when, è possibile personalizzare ng-switch-on espressione al fine di produrre valore specifico quando myConstant uguale 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

Questo è un approccio interessante, e certamente fa funzionare il mio esempio originale, ma non è solo un modo diverso di creare una condizione "se"? Il mio vero obiettivo è usare ng-switch per passare da un numero di valori costanti diversi. È possibile regolare la sintassi per supportarlo? –

+1

Probabilmente eseguirò la funzione di accensione che farà lo stesso lavoro dell'espressione. Guarda l'esempio modificato http://jsfiddle.net/MmCUr/11/ con costanti multiple. –

+0

Mi chiedo perché questo non funziona, almeno con l'ultima versione angolare stabile 1.2.2. Osservando il codice sorgente angolare, vedo quanto segue: ** ng-if ** guarda l'ambito iniettato nella sua funzione di collegamento. ** ng-switch ** controlla lo scope iniettato nella sua funzione di collegamento. Quindi, nella circostanza, che ** $ rootScope ** è disponibile per tutti gli altri ambiti derivati, entrambi dovrebbero risolvere le loro variabili di espressione nello stesso contesto. – angabriel