AngularJS:通过点击外部元素选择单选按钮

AngularJS: Select radio button by clicking on outer element

本文关键字:外部 元素 选择 单选按钮 AngularJS      更新时间:2023-09-26

我在angularjs应用程序中有以下代码:

    <div class="radio input-group-addon">
      <label>
        <input type="radio" name="radio1" value="foobar" ng-model="myModel" />
        my label
      </span>
    </div>

外部div为100%,背景色。现在我想让整个区域(整个div容器)都是可点击的。我在div上尝试了ng-click处理程序,如下所示:

    <div class="radio input-group-addon" ng-click="selectRadio($event)">
      <label>
        <input type="radio" name="radio1" value="foobar" ng-model="myModel" />
        my label
      </span>
    </div>

selectRadio($event)方法如下所示:

$scope.selectRadio = function($event) {
  var radio = $(event.currentTarget).find("input[type='radio']");
  radio.prop("checked", true);
  radio.trigger("change");
}

不幸的是,这不会触发myModel上的变化。是否有一种方法可以触发"model-bind-change"事件(不知道如何描述)来更新我的单选按钮的模型?

此外,我想知道,如果有一个更角度的方式来实现这一点?

这样做应该可以解决这个问题:

<div class="radio input-group-addon" ng-click="myModel = 'foobar'">
  <label>
    <input type="radio" name="radio1" value="foobar" ng-model="myModel" />
    my label
  </label>
</div>

因为你的input模型有一个双向绑定到你的作用域变量,你应该能够在你的函数中设置它:

$scope.selectRadio = function($event) {
    scope.myModel = 'foobar';
}

我已经为它创建了一个小指令,它可能不是最好的答案,但它解决了问题

Common.directive('radiobtn',function(){
    return {
        link:function(scope,elem,attr){
            var value=attr['radiobtn'];
            var radio=elem.find('input[type=radio]').first()
            if(radio.val()==value){
                elem.addClass('active');
            }
            radio.click(function(e) {
               //do something
               e.stopPropagation();
            })
            elem.on('click',function(event){
                //elem.addClass('active');
                radio.prop("checked", true);
                radio.trigger('click');

            });
        }
    }
});

你可以在标签标签

中使用这个指令

HTML

<div ng-repeat="item in $scope.items track by $index" ng-click="$scope.SelectRadio($index)">
    <input type="radio" name="radio1" ng-checked="$scope.clicked == $index" />
</div>
控制器

$scope.SelectRadio = function (rowIndex) {
    $scope.clicked = rowIndex;
}