AngularJS-选择单选按钮时触发


118

我搜索并尝试了许多ng-xxxx类型的选项,但找不到该选项。我只想在选择单选按钮时在控制器中调用某些功能。

因此,它可能类似于以下内容。(当然,下面的代码不起作用)

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

有什么方法可以实现我想要的吗?

Answers:


231

单选按钮的选择至少有两种调用功能的方法:

1)使用ng-change指令:

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

然后,在控制器中:

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

这是jsFiddle:http : //jsfiddle.net/ZPcSe/5/

2)观察模型的变化。这在输入级别上不需要任何特殊要求:

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

但在控制器中,它会具有:

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

和jsFiddle:http : //jsfiddle.net/vDTRp/2/

了解有关您的用例的更多信息将有助于提出适当的解决方案。


6
我正在使用AngularJS引导程序绑定。Watch不起作用,但是ng-change处理程序起作用。
zmbq

46
有没有办法为无线电组使用单个ng-change指令?
jEremyB

20
这个词value使它很混乱。
Vibhor Dube

1
@jEremyB ..我ng-change具体不知道单个事件...但是您可以使用方法2 避免多个事件处理程序(例如ng-change=...on上有on input):每个输入都需要一个on ng-model,然后您只需watch监听一次变更...
dsdsdsdsd

为什么不ng-click?
Tsagana Nokhaeva

19

如果触发源不是来自点击,则应使用ngChange而不是ngClick。

以下是您想要的吗?在您的情况下到底什么不起作用?

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
仅适用于点击。如果用户使用键盘设置单选按钮怎么办?
rodrigo-silveira 2014年

8

在较新版本的angular(我使用的是1.3)中,您基本上可以设置模型,并且值和double绑定可以完成此示例的所有工作,就像魅力一样:

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

动态值!

<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>

在控制器中

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

2

另一种方法是使用在控制器范围内将getter setter属性Object.defineProperty设置value为getter setter属性,然后对value属性的每次更改都会触发在setter中指定的功能:

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"/>

javascript文件:

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

看到这个plunker的实施


2

我更喜欢将ng-value与ng-if一起使用,[ng-value]将处理触发器更改

<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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.