【问题标题】:Why the inputs are not working right with ng-repeat [duplicate]为什么输入不能与 ng-repeat 一起正常工作 [重复]
【发布时间】:2016-11-11 13:06:30
【问题描述】:

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

}]);

【问题讨论】:

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


    【解决方案1】:

    因为ng-repeat 确实会在每次迭代时创建一个新的子作用域(原型继承),当它在放置ng-repeat 指令的任何位置重复模板时。

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

    在子作用域中,它包含primitive 所在的所有属性 创建子范围和对象时采用的属性初始值 值与它们的引用一起使用,因此在父范围值中更新 将在子范围值中更新,反之亦然。

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

    要解决此类问题,您可以在定义 ng-model 时使用 object,以便在定义 ng-model 时遵循 Dot rule。这意味着您可以在控制器中定义一个名为 $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 上发生。无论您想要哪个控制器变量,都可以使用该控制器的别名。

    【讨论】:

    • 很好的解释:)
    • @developer033 谢谢你的伙伴 :-)
    • @PankajParkar :在定义 ng-model 时使用点规则时,就像在您的示例中一样,我必须引用在控制器中创建的模型,才能正常工作,对吗?像:ng-model="model.kindSelected" 之后,我可以在孩子范围之外使用像:{{model.kindSelected}}
    • 正确,你有什么问题吗?我已经在示例中展示了代码的外观......
    • 非常感谢,很好的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2018-09-08
    • 2021-08-18
    • 2016-09-12
    • 2021-12-06
    • 2020-09-01
    相关资源
    最近更新 更多