如何正确构建AngularJS标记的无线电输入指令?

时间:2014-04-17 00:48:04

标签: angularjs angularjs-directive angularjs-ng-repeat

我意识到AngularJS已经有input[radio]指令,我想尽可能地利用它。

我创建了一个JSFiddle here,但我无法弄清楚如何让ng-model属性正常工作。我正在选择每个收音机,但selectedValue不会改变。

另外,请告诉我任何我在这里做错的事。我相信我可以做一些其他的改进。

HTML:

<div data-ng-controller="controller">
    <div
      data-ng-repeat="radio in radios"
      data-ng-model="selectedValue"
      data-name="radio1"
      data-label="{{radio.label}}"
      data-value="{{radio.value}}"
      data-labeled-radio></div>
    <br>
    selected value: {{selectedValue}}
</div>

JavaScript:

angular.module('app', [])
.controller('controller', function($scope) {
    $scope.selectedValue = 'FOO';
    $scope.radios = [
        { label: 'foo', value: 'FOO' },
        { label: 'bar', value: 'BAR' }
    ];
})
.directive('labeledRadio', function(){
    return {
        require: ['ngModel', 'value'],
        restrict: 'A',
        replace: true,
        template: [
            '<label class="radio">',
            '  <input class="radio__input" type="radio" data-ng-model="ngModel" name="{{name}}" value="{{value}}">',
            '  <span class="radio__label">{{label}}</span>',
            '</label>'
        ].join(''),
        scope: {
            ngModel: '=',
            label: '@',
            name: '@',
            value: '@'
        }
    }
});

1 个答案:

答案 0 :(得分:2)

由于原型继承在JavaScript中的工作方式,您不能在范围内使用原型进行双向数据绑定。因此,解决此问题的方法是将selectedValue更改为对象...

angular.module('app', [])
.controller('controller', function($scope) {
    $scope.selectedValue = { value: 'FOO' };
    $scope.radios = [
        { label: 'foo', value: 'FOO' },
        { label: 'bar', value: 'BAR' }
    ];
})

<div data-ng-controller="controller">
    <div
      data-ng-repeat="radio in radios"
      data-ng-model="selectedValue.value"
      data-name="radio1"
      data-label="{{radio.label}}"
      data-value="{{radio.value}}"
      data-labeled-radio></div>
    <br>
    selected value: {{selectedValue.value}}
</div>

小提琴:http://jsfiddle.net/gdnKW/

有关完整说明,请参阅此处:https://github.com/angular/angular.js/wiki/Understanding-Scopes