2013-06-30 14 views
5

devo semplice codice di controllo:Perché il valore dello scope non può essere modificato da HTML usando la tecnica "switch"?

JS

$scope.showErrorAlert = false; 


$scope.switchBool = function(value) { 
    value = !value; 
}; 

HTML

<div class="alert alert-error" ng-show="showErrorAlert"> 
       <button type="button" class="close" data-ng-click="switchBool(showErrorAlert)" >×</button> 
       <strong>Error!</strong> {{errorTextAlert}} 
      </div> 

Da frammenti di codice si può vedere che provo a cambiare $scope.showErrorAlert valore.

Tuttavia, non funziona, value modifiche ma non showErrorAlert.

Qualcuno può dirmi perché e come farlo funzionare, per favore?

si

+0

+1 per la tua buona domanda :) –

risposta

5

Altri hanno già fornito una risposta adeguata sul motivo per cui la variabile passata non è stata modificata per l'ambito. Ma se il vostro vero e proprio caso d'uso è solo per commutare il valore booleano che ci sono almeno altri due modi semplificati per l'esecuzione che:

a) Alterna la variabile direttamente all'interno dell'espressione ngClick:

<button type="button" ng-click="showErrorAlert = !showErrorAlert">×</button> 

b) Alternare la variabile passando il nome della variabile per una generica funzione di "switch":

<button type="button" ng-click="switchBool('showErrorAlert')">×</button> 
$scope.switchBool = function(var){ 
    $scope[var] = !$scope[var]; 
}; 
+0

Grande esempio (b) '$ scope [var] =! $ scope [var];', grazie –

2
$scope.showErrorAlert = false; 


$scope.switchBool = function(value) { 
    value = !value; 
}; 

grazie quando si passa un valore per switchBool, è passato per valore, non riferimento. Quindi il valore viene modificato solo all'interno di quella funzione.

Si potrebbe provare a passare il nome var, come $scope.showErrorAlert e poi fare qualcosa di simile all'interno switchBool:

eval(value + " = !" + value); 

in azione: http://jsfiddle.net/Npp2N/1/

$scope.showErrorAlert = false; 
$scope.switchBool = function(value) { 
    eval(value + " = !" + value); 
}; 

console.log($scope.showErrorAlert); // false 
$scope.switchBool("$scope.showErrorAlert"); 
console.log($scope.showErrorAlert); // true 
6

JS passa i parametri per valore. Un semplice sostituto per passare per riferimento è passare un oggetto (al contrario della proprietà stessa).

I.e.

$scope.showErrorAlert = { value: false }; 

$scope.switchBool = function(obj) { 
    obj.value = !obj.value; 
}; 

o si potrebbe refactoring del codice switchBool di operare su $ portata stessa. Devi hardcode o astrarre "showErrorAlert" quindi, difficile. Dipende dalle tue esigenze

+2

nessun bisogno di dichiarare nuova sintassi Object basta usare $ scope.sh owErrorAlert = {value: false} –

Problemi correlati