Angular.js以编程方式将表单字段设置为脏

时间:2013-08-06 04:07:56

标签: angularjs

我正在以编程方式使用值更新表单上的某些字段,并且我希望将字段状态设置为$dirty。做类似的事情:

$scope.myForm.username.$dirty = true;似乎不起作用。

我可以使用方法$setPristine来重置字段的状态但是没有$setDirty方法吗?

那么如何做到这一点?

我看过这篇文章https://groups.google.com/forum/#!topic/angular/NQKGAFlsln4,但我似乎无法找到$setDirty方法。我使用的是Angular 1.1.5版。

11 个答案:

答案 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)

您必须为该字段手动设置$dirtytrue$pristinefalse。如果您希望类在输入中显示,则必须手动添加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();
    }
}