AngularJS - Trigger quando viene selezionato il pulsante di opzione


118

Ho cercato e provato molti tipi di opzioni ng-xxxx ma non sono riuscito a trovare quella .. Voglio solo chiamare qualche funzione nel controller quando il pulsante di opzione è selezionato.

Quindi potrebbe essere simile al seguente .. (Ovviamente, il codice sottostante non funziona)

<input type="radio" ng-model="value" value="one" ng-click="checkStuff()"/>

C'è un modo per ottenere ciò che voglio?

Risposte:


231

Esistono almeno 2 diversi metodi per richiamare le funzioni sulla selezione del pulsante di opzione:

1) Utilizzo della ng-changedirettiva:

<input type="radio" ng-model="value" value="foo" ng-change='newValue(value)'>

e poi, in un controller:

$scope.newValue = function(value) {
     console.log(value);
}

Ecco il jsFiddle: http://jsfiddle.net/ZPcSe/5/

2) Guardando il modello per i cambiamenti. Ciò non richiede nulla di speciale a livello di ingresso:

<input type="radio" ng-model="value" value="foo">

ma in un controller si avrebbe:

$scope.$watch('value', function(value) {
       console.log(value);
 });

E il jsFiddle: http://jsfiddle.net/vDTRp/2/

Sapere di più sul tuo caso d'uso aiuterebbe a proporre una soluzione adeguata.


6
Sto usando i binding di AngularJS Bootstrap. Watch non funziona, ma il gestore ng-change sì.
zmbq

46
C'è un modo per utilizzare una singola direttiva ng-change per il gruppo radio?
jEremyB

20
La parola valuelo rende abbastanza confuso.
Vibhor Dube

1
@jEremyB .. Non conosco il singolo in ng-changeparticolare ... ma puoi evitare più gestori di eventi (come averne uno ng-change=...su ogni input) usando il metodo 2: ogni input richiede un ng-modele quindi hai un unico watchascolto per il cambia ...
dsdsdsdsd

perché non fare clic?
Tsagana Nokhaeva

19

Dovrebbe usare ngChange invece di ngClick se la sorgente del trigger non proviene dal clic.

Il sotto è quello che vuoi? cosa non funziona esattamente nel tuo caso?

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

function MyCtrl($scope) {
    $scope.value = "none" ;
    $scope.isChecked = false;
    $scope.checkStuff = function () {
        $scope.isChecked = !$scope.isChecked;
    }
}


<div ng-controller="MyCtrl">
    <input type="radio" ng-model="value" value="one" ng-change="checkStuff()" />
    <span> {{value}} isCheck:{{isChecked}} </span>
</div>   

4
Funziona solo per i clic. Cosa succede se gli usi imposta un pulsante di opzione utilizzando la tastiera?
rodrigo-silveira

8

Nelle versioni più recenti di angular (sto usando 1.3) puoi fondamentalmente impostare il modello e il valore e la doppia legatura fanno tutto il lavoro che questo esempio funziona come un fascino:

angular.module('radioExample', []).controller('ExampleController', ['$scope', function($scope) {
  $scope.color = {
    name: 'blue'
  };
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<html>
<body ng-app="radioExample">
<form name="myForm" ng-controller="ExampleController">
  <input type="radio" ng-model="color.name" value="red">  Red <br/>
  <input type="radio" ng-model="color.name" value="green"> Green <br/>
  <input type="radio" ng-model="color.name" value="blue"> Blue <br/>
  <tt>color = {{color.name}}</tt><br/>
 </form>
  </body>
</html>


4

Per valori dinamici!

<div class="col-md-4" ng-repeat="(k, v) in tiposAcesso">
    <label class="control-label">
        <input type="radio" name="tipoAcesso" ng-model="userLogin.tipoAcesso" value="{{k}}" ng-change="changeTipoAcesso(k)" />              
        <span ng-bind="v"></span>
    </label>
</div>

nel controller

$scope.changeTipoAcesso = function(value) {
    console.log(value);
};

2

Un altro approccio consiste nell'usare Object.definePropertyl'impostazione valuecome proprietà getter setter nell'ambito del controller, quindi ogni modifica alla proprietà value attiverà una funzione specificata nel setter:

Il file HTML:

<input type="radio" ng-model="value" value="one"/>
<input type="radio" ng-model="value" value="two"/>
<input type="radio" ng-model="value" value="three"/>

Il file javascript:

var _value = null;
Object.defineProperty($scope, 'value', {
  get: function () {
    return _value;
  },         
  set: function (value) {
    _value = value;
    someFunction();
  }
});

vedere questo plunker per l'implementazione


2

preferisco usare ng-value con ng-if, [ng-value] gestirà le modifiche del trigger

<input type="radio"  name="isStudent" ng-model="isStudent" ng-value="true" />

//to show and hide input by removing it from the DOM, that's make me secure from malicious data

<input type="text" ng-if="isStudent"  name="textForStudent" ng-model="job">

-1
 <form name="myForm" ng-submit="submitForm()">
   <label data-ng-repeat="i in [1,2,3]"><input type="radio" name="test" ng-model="$parent.radioValue" value="{{i}}"/>{{i}}</label>
   <div>currently selected: {{radioValue}}</div>
   <button type="submit">Submit</button>
</form>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.