我需要一种方法来遍历AngularJS表单的注册控件。本质上,我试图获取所有的$
dirty控件,但是没有控件数组(FormController除了包含控件本身以外,还具有许多不同的属性/函数-每个控件都是自己的对象)。
我一直在查看源代码,并且看到controls
FormController中有一个数组正是我要查找的数组。有没有一种方法可以访问此值,或者扩展FormController使其包含返回此controls
数组的函数?
编辑:Plnkr演示
另外,我意识到从技术上讲,我可以检查键字符串中的第一个字符“ $”,但是我想避免这种情况,以防FormController
/指令在Angular的未来版本中发生更改。
编辑2:另一个说明:我所有的目标是能够通过遍历整个控件列表(不包括$ dirty,$ invalid,$ error,$
name,以及其他保留在Form对象中的属性),或者通过扩展FormController并创建一个仅返回当前脏控件(且不等于其初始值)的函数来创建
编辑3:我正在寻找的解决方案需要适用于不同结构的表单/模型。范围内的模型是通过AJAX生成的,因此它们的结构已经设置好(我想避免必须为我已经通过AJAX接收到的所有数据硬编码新的结构)。另外,我希望在多个表单/模型之间使用此表单提交过程,并且每个表单/模型具有不同的JSON结构-
因为它们适用于我们的对象模型中的不同实体。这就是为什么我选择要求一种方法来访问controls
FormController中的对象(我将从FormController
下面发布代码)的原因,因为这是我唯一可以获得所有字段的平面数组的地方。
function FormController(element, attrs) {
var form = this,
parentForm = element.parent().controller('form') || nullFormCtrl,
invalidCount = 0, // used to easily determine if we are valid
errors = form.$error = {},
controls = [];
// init state
form.$name = attrs.name || attrs.ngForm;
form.$dirty = false;
form.$pristine = true;
form.$valid = true;
form.$invalid = false;
parentForm.$addControl(form);
// Setup initial state of the control
element.addClass(PRISTINE_CLASS);
toggleValidCss(true);
// convenience method for easy toggling of classes
function toggleValidCss(isValid, validationErrorKey) {
validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
element.
removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
}
/**
* @ngdoc function
* @name ng.directive:form.FormController#$addControl
* @methodOf ng.directive:form.FormController
*
* @description
* Register a control with the form.
*
* Input elements using ngModelController do this automatically when they are linked.
*/
form.$addControl = function(control) {
controls.push(control);
if (control.$name && !form.hasOwnProperty(control.$name)) {
form[control.$name] = control;
}
};
/**
* @ngdoc function
* @name ng.directive:form.FormController#$removeControl
* @methodOf ng.directive:form.FormController
*
* @description
* Deregister a control from the form.
*
* Input elements using ngModelController do this automatically when they are destroyed.
*/
form.$removeControl = function(control) {
if (control.$name && form[control.$name] === control) {
delete form[control.$name];
}
forEach(errors, function(queue, validationToken) {
form.$setValidity(validationToken, true, control);
});
arrayRemove(controls, control);
};
// Removed extra code
}
如您所见,表单本身具有controls
私有数组。我想知道是否有扩展我的方法,FormController
以便可以将该对象公开?还是创建一个公共函数,以便至少可以查看私有数组?
要直接解决该问题,请像这样修改@lombardo的答案;
var dirtyFormControls = [];
var myForm = $scope.myForm;
angular.forEach(myForm, function(value, key) {
if (typeof value === 'object' && value.hasOwnProperty('$modelValue') && value.$dirty)
dirtyFormControls.push(value)
});
然后,数组“ dirtyFormControls”将包含脏的表单控件。
您还可以使用此技巧在提交表单时显示错误消息,以进行“必需”验证和所有其他验证。在您的commit()函数中,您将执行类似的操作;
if (form.$invalid) {
form.$setDirty();
angular.forEach(form, function(value, key) {
if (typeof value === 'object' && value.hasOwnProperty('$modelValue'))
value.$setDirty();
});
//show user error summary at top of form.
$('html, body').animate({
scrollTop: $("#myForm").offset().top
}, 1000);
return;
}
在您的表格中,您将显示错误消息
<span ng-messages="myForm['subject-' + $index].$error" ng-show="myForm['subject-' + $index].$dirty" class="has-error">
<span ng-message="required">Course subject is required.</span>
</span>
当您使用“ ng-repeat”或类似方法动态生成控件时,上述解决方案很有用。
我将Xamarin.forms用于Android应用程序,并试图从CDCard获得文件列表。以下代码: 返回本地路径,而不是cd卡的路径/存储/仿真/0
问题内容: 这是我的桌子: 每篇文章可以具有一个或多个与之关联的图像。我想在页面上显示最后40篇书面文章,以及与该文章相关的最新图像。我不知道的是如何与article_images表联接,并且仅检索单个行。 编辑:解决方案必须表现良好,这一点很重要。到目前为止,我所看到的解决方案(使用派生表)需要一分钟或更长时间才能完成。 问题答案: 在查看了其他答案之后,它帮助我意识到了一个潜在的问题。 Art
本文向大家介绍jQuery操作DOM之获取表单控件的值,包括了jQuery操作DOM之获取表单控件的值的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery操作DOM之获取表单控件的值。分享给大家供大家参考。具体分析如下: HTML属性与DOM属性差别最大的地方,恐怕就要数表单控件的值了。比如,文本输人框的 value属性在DOM中的属性叫defaultValue,DOM中就没有va
我正在尝试使用spring data JPA repository方法在数据库中插入4个表单字段name、age、location和address。当我将表单提交到操作时,控制器不会无法接收提交的值。在控制器操作中获取null。在这里,我尝试使用spring、spring boot和spring data JPA。下面是我的控制器, 我的形式是, 导入javax.persistence.*;
使用JavaFX和Scene Builder,我试图从控制器访问标签内的文本。 我在控制器中初始化了一个标签,如下所示: fxml文件中包含以下代码: 我已使用场景生成器将标签绑定到控制器中的此函数: 我的想法是调用类似label1的东西。getText()。但为此,我需要获得标签的fx:id,而且由于我需要许多标签,所以我无法单独硬编码所有id案例。 在JavaFX控制器中获取单击对象id的更好
我使用simple in camel编写脚本语言。我只需要将主体设置为空。 我试试这个: 它将正文设置为文字字符串“null”。 如果我这样做: 它可以工作,但似乎有点笨重。有没有一种简单的方式来表示null?