为什么输入不能正确使用ng-repeat

时间:2016-07-08 21:17:40

标签: javascript angularjs angularjs-ng-repeat ng-repeat

有人可以向我解释为什么在这个简单的例子中我无法获得当前所选的单选按钮。我尝试使用ng-repeat指令动态生成单选按钮,并使用ng-model选择当前的单选按钮。 像这样:

模板:

<div ng-repeat="kind in movieKinds">
    <input type="radio" name="movies" ng-value="kind" ng-model="kindSelected"> {{kind.name}}<br>
</div>
Selected Movie :{{kindSelected}}

控制器:

mymodule.controller('MainCtrl', [ '$scope',function ($scope) {

    $scope.movieKinds = [
        {'name' : 'Action', 'movies' : ['Action#1', 'Action#2', 'Action#3']},
        {'name' : 'Comedy', 'movies' : ['Comedy#1', 'Comedy#2', 'Comedy#3']},
        {'name' : 'Drama', 'movies' : ['Drama#1', 'Drama#2']},
        {'name' : 'Horror', 'movies' : ['Horror#1']}
    ];

}]);

1 个答案:

答案 0 :(得分:2)

因为ng-repeat在每次迭代时都会在ng-repeat指令所在的位置重复模板时创建新的子范围(原型继承)。

  

那么当ng-repeat创建一个新的原型继承的子范围时会发生什么?

     

在子范围内,它包含primitive的所有属性   创建子范围时所用的属性初始值&amp;宾语   值与其引用一起使用,因此在父作用域值中更新   将更新子范围值&amp;反之亦然。

在您的情况下,您在ng-model="kindSelected"内部有ng-repeat变量,因此范围变量在ng-repeat范围内创建,并且在ng-repeat指令之外无法使用。

要解决此类问题,您可以在定义object时使用ng-model,以便在定义Dot rule时可以关注ng-model。这意味着您可以在控制器和放大器中定义一个名为$scope.model的对象。然后添加kindSelected属性,以便在选中复选框时更新该值。

<强>标记

<div ng-repeat="kind in movieKinds">
    <input type="radio" name="movies" ng-value="kind" ng-model="kindSelected"> {{kind.name}}<br>
</div>
Selected Movie :{{model.kindSelected}}

<强>代码

$scope.model = {};

解决此问题的另一种方法是使用controllerAs语法,该语法将使用控制器的别名,因此范围层次结构相关的问题不会发生在HTML上。无论您想要哪个控制器变量,都可以使用控制器的别名。