将ngModel绑定到具有隔离范围的AngularJS指令

时间:2014-08-30 18:39:32

标签: angularjs angularjs-directive angularjs-scope

我正在尝试构建一个呈现无线电输入和相关标签的Angular指令。该指令的HTML如下所示:

<d-radio name="gender" value="male" label="I'm a male"></d-radio>
<d-radio name="gender" value="female" label="I'm a female"></d-radio>

我希望它等同于:

<input type="radio" name="gender" id="male" value="male" ng-model="gender"><label for="male">I'm a male</label>
<input type="radio" name="gender" id="female" value="female" ng-model="gender"><label for="female">I'm a female</label>

这里是JS代码:

app.directive('dRadio', function() {
    return {
        restrict: 'E',
        scope: true,
        template: '<input type="radio" id="{{value}}" name="{{name}}" value="{{value}}"><label for="{{value}}">{{label}}</label>',
        link: function(scope, element, attrs) {
            scope.name = attrs.name;
            scope.value = attrs.value;
            scope.label = attrs.label;
        }
    };
});

我的指令中唯一缺少的是ng-model部分。由于每个指令都创建了一个独立的范围,我不确定如何将模型绑定到它。

这里有类似的Stack Overflow问题: Isolating directive scope but preserve binding on ngModel

我试过这个解决方案,但是我无法让它发挥作用。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

如果您想要双向绑定,则需要在示波器中添加model: '='。这样你就可以在你的范围内有一个模型变量,它将与你在html中指明的变量绑定

app.directive('dRadio', function() {
    return {
        restrict: 'E',
        scope: { model: '=' },
        template: '<input type="radio" ng-model="{{model}}" id="{{value}}" name="{{name}}" value="{{value}}">    <label for="{{value}}">{{label}}</label>',
        link: function(scope, element, attrs) {
            scope.name = attrs.name;
            scope.value = attrs.value;
            scope.label = attrs.label;
        }
    };
});

在你的HTML中

<d-radio name="gender" value="male" label="I'm a male" model="gender"></d-radio>