- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个大表格,我已将其拆分为多个选项卡。每个选项卡包含多个不同的输入字段,并对输入进行验证。现在我只有每个输入字段的验证,但我现在正在尝试为每个选项卡添加验证。也就是说,我希望选项卡指示其输入字段是否包含验证错误。
表单使用 ngRepeat 呈现:
<form name="createForm" novalidate>
<ul class="nav nav-tabs">
<li ng-repeat="tab in tabs" ng-class="{active: $index == 0}">
<a ng-hide="tab.isValid" data-target="#tab{{$index + 1}}" data-toggle="tab" class="invalid">{{tab.title}}</a>
<a ng-show="tab.isValid" data-target="#tab{{$index + 1}}" data-toggle="tab">{{tab.title}}</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade in" id="tab{{$index + 1}}" ng-repeat="tab in tabs" ng-class="{active: $index == 0}">
<div ng-include="'/view/create/partials/' + tab.content"></div>
</div>
</div>
</form>
标签数组:
$scope.tabs = [
{ title: "Tab1", content: 'tab1.html', isValid: true },
{ title: "Tab2", content: "tab2.html", isValid: true },
{ title: "Tab3", content: "tab3.html", isValid: true }];
每个选项卡的 HTML:
<label for="age">Age</label>
<input type="text" class="form-control" ng-model="person.tab1.Age" name="Age" maxlength="3" data-integer />
<label for="height">Height</label>
<input type="text" class="form-control" ng-model="person.tab1.Height" name="Height" data-float />
'data-integer' 和 'data-float' 是自定义验证指令:
var INTEGER_REGEXP = /^\d*$/;
app.directive('integer', function () {
return {
require: 'ngModel',
link: function (scope, elm, attrs, ctrl) {
ctrl.$parsers.unshift(function (viewValue) {
if (INTEGER_REGEXP.test(viewValue)) {
ctrl.$setValidity('integer', true);
return parseInt(viewValue);
} else {
ctrl.$setValidity('integer', false);
return undefined;
}
});
}
};
});
我的想法是,如果它的任何子输入字段无效,则将“isValid”变量设置为 false。我不确定在哪里执行此功能或此功能的外观。我也非常欢迎您提供有关改进或其他方法的想法。
最佳答案
您使用表单对验证进行分组,因此在一个简单的场景中,每个选项卡都有一个单独的表单。但是,我知道您希望有一个根表单来处理提交,但是将选项卡字段组合在一起以提供更细粒度的 UI 响应以进行验证。
在这种情况下,您可以使用嵌套表单。 See this example for more information .您将拥有一个根 form
(当然是命名的),然后为其中的每个组声明额外的 ng-form
。请注意,您必须专门针对嵌套表单使用 ng-form
指令,因为浏览器不允许您嵌套 form
标记; ng-form
指令作为一个元素解决了这个问题。
对您来说,这意味着您将保持父表单不变。然后你只需用它们自己的 ng-form
指令包装每个选项卡中的字段,为每个选项卡提供一个唯一的名称来表示每个选项卡。每个选项卡的有效性将反射(reflect)在根表单 (createForm
) 中,因此您仍然可以使用典型方法检查表单是否总体有效,例如createForm.$invalid
等。但是,您现在也可以检查嵌套表单的状态,例如createForm.Tab1Form.$valid
。
这里唯一的问题是 ng-form
不计算 name
属性,它使用文字值,所以你会遇到动态生成该名称的麻烦tab.title
就像你可能想做的那样。我通过在模板中给他们一个文字名称来解决这个问题。
<form name="createForm" novalidate="">
<ul class="nav nav-tabs">
<li ng-repeat="tab in tabs" ng-class="{active: $index == 0}">
<a data-target="#tab{{$index + 1}}" data-toggle="tab" ng-class="{'invalid': createForm.{{tab.title}}.$invalid}">{{tab.title}}</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade in" id="tab{{$index + 1}}" ng-repeat="tab in tabs" ng-class="{active: $index == 0}">
<div ng-include="tab.content"></div>
</div>
</div>
</form>
您会注意到,如果选项卡的嵌套表单无效(在字段 1 中键入一个值,您会看到验证错误类消失),选项卡标题为红色。请注意,我没有在演示中连接您的 Bootstrap JavaScript 行为,因为我很懒,但我相信我已经说明了这一点。
关于javascript - 使用 ngRepeat 在 Angular 中进行分组验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753115/
我有一个使用 ngRepeater 显示的数组,但通过这个指令,我使用 ngInit 指令来执行应该返回要显示的对象的函数。一切都工作正常,但是当我添加“新建”按钮并向数组添加新值时,只有一次我认为函
我想将搜索框的 $filter 应用于嵌套的 ng-repeat。我有一个类别数组,每个类别都包含一个项目列表。当我将 $filter 放在第一个 ngRepeat 上时,它会过滤并保留具有正确项目的
我正在尝试从嵌套的 ngRepeat 中访问 ngRepeat 父级的 $first。有没有办法在嵌套的 ngRepeat 中使用别名或访问 $first?我试过 $parent.$first,但它似
我正在使用 ng-repeat 指令呈现 TinyMCE 所见即所得列表: 当我更改 Controller 中小部件的顺序时,TinyMCE 的实例会自动相应地重新排列。 问题是 Tin
Controller 代码: function usersView() { var directive = { templateUrl : "users/users.
当 ng-repeat 完成更新时,我在触发指令时遇到了一些 AngularJS 问题。我有三个命名数组,通过三个链接切换到,允许 ng-repeat 显示选定的数组。我想在完成后关闭一些代码,因为我
当 Angular 指令包含 ngRepeat 元素时,ngRepeat 执行似乎发生在包含指令的链接执行之后。 是否有一种机制($watch、$observe 等)可用于在 ngRepeat 执行后
我试图允许重命名一行中的项目。我知道使用 $scope.editMode 等,但我意识到,当我将其用于 ng-repeats 时,我将列表中的所有条目都视为可编辑,而不是特定索引。这是我的 Html
我有一个对象数组。我正在尝试设置一种方法来按用户输入中的每一列进行过滤。 每个列都有一个输入下拉列表,您可以在其中选择一个值,这样您就可以为每列选择不同的过滤器。 col1 col2 col3 c
如果我有一个对象,其属性是数组,如何按该属性的第一个元素进行过滤? 数据 { Id: "0", Name: ["John", "Doe"] } ngRepeat {{ u.Name[0
我正在编写一个 AngularJS 应用程序(Angular 1),它需要在页面上显示一个表格列表。然而,某些键需要首先显示,如下所示: baz (data) bar (data) foo (data
我找到了source code ngRepeat 没有 HTML Compiler 指南中提到的 compile 选项. 我对此感到困惑...... 谁能告诉我为什么...... 最佳答案 ngRep
我有一个严重的问题。我必须实现一个包含一些组合数据的表格 View 。我必须在表行中显示一些数据,后面的行必须是有关该行的一些详细信息。更重要的是,用户应该能够隐藏单击该行的详细信息。 例如,模型是某
我有一个数组,其中包含一些数据,名为 data . 数据如下: var data = [ { id: 1, title: 'title', desc: 'desc',
我们可以在一个 html 标签中使用多个 ngRepeats 吗?就像下面的代码: 或 我们可以使用 && 区分同一个 ngRepeat 中的两个不同功能吗?就像下面的代码: 我的目的是创
我需要重复我拥有的所有项目,但我需要通过“数量”属性重新重复项目。 $scope.products = [{name: 'Mouse', price: 2, quantity: 3},
我正在构建一个旋转木马,方法是从数组的开头移动一个元素,然后将其推回到末尾,使旋转木马前进。从数组末尾弹出一个元素并将其取消移位到数组的开头将倒回该元素。这很好用。当我尝试为它制作动画时,问题就出现了
我在我的 Angular 应用程序中使用 ngRepeat,由于某种原因,ngRepeat 没有填充,即使它连接到的集合填充了正确的数据。 我正在做的是向节点服务器发送 http get 请求以请求数
当 AngularJS 1.6.0(与旧版本相同)和 ngRepeat 指令用作元素嵌套在表格中时,我遇到了一个奇怪的问题。 简单地说在 , 然后放一个 内部:它不起作用。但是如果你把 在 之外,例
我想访问我的数组数组的每个值: [ ["0","0","0"], ["1","1","1"], ["1","0","0"] ] 我只在里面做了两次 ngRepeat {{line}}
我是一名优秀的程序员,十分优秀!