我正在以编程方式使用值更新表单上的某些字段,并且我希望将字段状态设置为$dirty
。做类似的事情:
$scope.myForm.username.$dirty = true;
似乎不起作用。
我可以使用方法$setPristine
来重置字段的状态但是没有$setDirty
方法吗?
那么如何做到这一点?
我看过这篇文章https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4,但我似乎无法找到$setDirty
方法。我使用的是Angular 1.1.5版。
答案 0 :(得分:86)
在你的情况下,$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue);
可以解决问题 - 它会使表单和字段变脏,并附加适当的CSS类。
说实话,我从你问题的链接中在主题的新帖子中找到了这个解决方案。它对我来说非常有用,所以我把它放在这里作为一个独立的答案,以便更容易找到。
修改强>
以上解决方案最适用于1.3.3之前的Angular版本。从1.3.4开始,您应该使用$setDirty()
中新曝光的API方法ngModel.NgModelController
。
答案 1 :(得分:50)
自AngularJS 1.3.4起,您可以在字段(source)上使用$setDirty()
。例如,对于每个有错误且标记为必需的字段,您可以执行以下操作:
angular.forEach($scope.form.$error.required, function(field) {
field.$setDirty();
});
答案 2 :(得分:17)
您必须为该字段手动设置$dirty
至true
和$pristine
至false
。如果您希望类在输入中显示,则必须手动添加ng-dirty
并从元素中删除ng-pristine
类。您可以在表单级别使用$setDirty()
在表单上执行所有操作,但不是表单输入,表单输入当前没有$setDirty()
,如您所述。
此答案可能会在将来发生变化,因为他们应该将$setDirty()
添加到输入中,这似乎是合乎逻辑的。
答案 3 :(得分:10)
如果您有权访问NgModelController(您只能通过指令访问它),那么您可以致电
ngModel.$setViewValue("your new view value");
// or to keep the view value the same and just change it to dirty
ngModel.$setViewValue(ngModel.$viewValue);
答案 4 :(得分:9)
为您解决这个问题,为您制作了一个jsFiddle。只需将$ dirty设置为true,但使用$timeout 0
,以便在加载DOM后运行。
在此处找到它:JsFiddle
$timeout(function () {
$scope.form.uName.$dirty = true;
}, 0);
答案 5 :(得分:6)
这对我有用
$scope.form_name.field_name.$setDirty()
答案 6 :(得分:5)
执行此任务的辅助函数:
function setDirtyForm(form) {
angular.forEach(form.$error, function(type) {
angular.forEach(type, function(field) {
field.$setDirty();
});
});
return form;
}
答案 7 :(得分:5)
您可以使用$setDirty();
方法。请参阅文档https://docs.angularjs.org/api/ng/type/form.FormController
示例:
$scope.myForm.$setDirty();
答案 8 :(得分:4)
Angular 2
对于那些希望在Angular 2中做同样事情的人来说,除了获得表格之外,它非常相似
ContentResolver musicResolver = getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cSong = musicResolver.query(musicUri,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DATA},null,null,null);
[yourtextfield resignfirstresponder];
答案 9 :(得分:3)
@ rmag的答案的附加说明。如果您想要使用脏的空但必填字段,请使用:
$scope.myForm.username.$setViewValue($scope.myForm.username.$viewValue !== undefined
? $scope.myForm.username.$viewValue : '');
答案 10 :(得分:-1)
我不确定你为什么要把字段标记为脏,但我发现自己处于类似的情况,因为当有人试图提交无效表单时,我希望显示验证错误。我最终使用jQuery删除.ng-pristine
类标记并将.ng-dirty
类标记添加到适当的字段。例如:
$scope.submit = function() {
// `formName` is the value of the `name` attribute on your `form` tag
if (this.formName.$invalid)
{
$('.ng-invalid:not("form")').each(function() {
$(this).removeClass('ng-pristine').addClass('ng-dirty');
});
// the form element itself is index zero, so the first input is typically at index 1
$('.ng-invalid')[1].focus();
}
}