有人可以向我解释为什么在这个简单的例子中我无法获得当前所选的单选按钮。我尝试使用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']}
];
}]);
答案 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上。无论您想要哪个控制器变量,都可以使用控制器的别名。