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.