javascript - Angularjs ng-repeat、ng-form 和验证错误

标签 javascript angularjs

代码的简化版本:

<!DOCTYPE html>
<html ng-app="main">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://code.angularjs.org/1.4.3/angular.min.js"></script>
    <script>
        var app = angular.module("main", []);
        app.controller("TestController", function($scope) {
            $scope.addresses = [{street: ""}, {street: ""}];
            $scope.next = function() {
                if ($scope.addressMainForm.addressForm.$valid) {
                    console.log("valid");
                } else {
                    console.log("invalid");
                }
                $scope.addresses.push({street: ""});
            };
            $scope.remove = function(index) {
                $scope.addresses.splice(index, 1);
            };
        });
    </script>
</head>
<body>

    <div ng-controller="TestController" style="width: 500px;">
        <form name="addressMainForm">
            <div ng-repeat="address in addresses">
                <ng-form name="addressForm">
                    <input ng-model="address.street" required name="street" type="text" placeholder="street" />
                    <button ng-if="$index > 0" ng-click="remove($index)">REMOVE</button>
                </ng-form>
                <br>
            </div>
        </form>
        <br>
        <button ng-click="next()">NEXT</button>
    </div>

</body>
</html>

在浏览器中看起来像这样:

enter image description here

当我点击“删除”,然后点击“下一步”时 - 产生 JavaScript 错误:

Error: $scope.addressMainForm.addressForm is undefined

如果数组中明显还剩下一个元素,为什么它是未定义的?其他一切都工作正常(console.log 输出),直到所有元素都被删除,但最后一个元素和“NEXT”被单击。

最佳答案

当您调用 $scope.addressMainForm.addressForm.$valid 时,您正在尝试调用 check 来查看 adressForm 元素是否有效,但是您的 remove 函数已删除与该元素关联的addresses 条目。所以该表单确实仍然存在,但该调用变得非法。

试试这个:

<!DOCTYPE html>
<html ng-app="main">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://code.angularjs.org/1.4.3/angular.min.js"></script>
    <script>
        var app = angular.module("main", []);
        app.controller("TestController", function($scope) {
            $scope.addresses = [{street: ""}, {street: ""}];
            $scope.next = function() {
                if ($scope.addressMainForm.$valid) {
                    console.log("valid");
                } else {
                    console.log("invalid");
                }
                $scope.addresses.push({street: ""});
            };
            $scope.remove = function(index) {
                $scope.addresses.splice(index, 1);
            };
        });
    </script>
</head>
<body>

    <div ng-controller="TestController" style="width: 500px;">
        <form name="addressMainForm">
            <div ng-repeat="address in addresses">
                <ng-form name="addressForm">
                    <input ng-model="address.street" required name="street" type="text" placeholder="street" />
                    <button ng-if="$index > 0" ng-click="remove($index)">REMOVE</button>
                </ng-form>
                <br>
            </div>
        </form>
        <br>
        <button ng-click="next()">NEXT</button>
    </div>

</body>
</html>

关于javascript - Angularjs ng-repeat、ng-form 和验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100375/

相关文章:

javascript - 如何上传文件并将其显示为 html

javascript - jQuery 检查图像是否加载

逗号分隔小数的 Javascript 正则表达式

javascript - 如何在数据表列中仅显示前 30 个字符,然后放置“阅读更多”按钮?

javascript - 如何将一个数据字段的值复制到同一 SQLite 数据库中的另一个表

javascript - 使用 MVC、C# 和 AngularJS 时如何在页面加载时保留页面的下拉值?

angularjs - ionic 框架 View 标题未显示

javascript - 怎么不推全阵没有这个产品

angularjs - 带有属性选择器的组件导致子元素不渲染

angularjs - 用于力矩范围的 Angular 模块