小编典典

为什么输入不能与ng-repeat一起正常使用

angularjs

有人可以向我解释为什么在这个简单示例中我无法获得当前选择的单选按钮。我正在尝试使用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']}
    ];

}]);

阅读 277

收藏
2020-07-04

共1个答案

小编典典

因为ng-repeat当它ng-repeat在放置指令的位置重复模板时,确实会在每次迭代中创建一个新的子范围(通常是继承的)。

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

在子作用域中,它包含所有属性,其中primitive
在创建子作用域和对象值时会采用属性初始值及其引用,因此父作用域值的更新将在子作用域值中更新,反之亦然。

在这里,在您的情况下,您在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上不会发生与范围层次结构相关的问题。无论您要使用哪个控制器变量,都可以使用该控制器的别名。

2020-07-04