【问题标题】:Unsubmit a form in Angular在 Angular 中取消提交表单
【发布时间】:2015-11-20 22:06:15
【问题描述】:

我需要一个能够同时成为 $dirty 和不是 $submitted 的表单才能使我的验证工作。

我正在尝试通过 CSS 使用由 angular 动态添加的 .ng-invalid.ng-dirty.ng-submitted 类来实现这一点。这意味着我不能简单地将表单上的 $submitted 设置为 false,因为这不会删除关联的类。我也不能使用$setPristine$setUntouched,因为它们会删除$dirty 标志及其类。

有没有办法将表单设置为未提交,以便删除 .ng-submitted 类并且表单仍然脏?

【问题讨论】:

标签: javascript angularjs forms


【解决方案1】:

您可以使用$setPristine,后跟$setDirty。如果您想保留 $dirty 值,请在将其设置为原始值之前将其保存。

var formWasDirty = form.$dirty;

form.$setPristine(); 

if (formWasDirty) { 
  form.$setDirty();
}

http://plnkr.co/edit/nCgu7eBWAXwO3xeYTa6V?p=preview

【讨论】:

  • 请记住,这会丢弃各个表单控件上的脏状态。
【解决方案2】:

不幸的是,there isn't a built in $setUnsubmitted 在 Angular 中起作用。

但是,$setSubmitted 函数的 source 非常简单。您可以轻松地利用表单指令上的装饰器来提供此功能。

angular.module('YourModule').directive('form', function() {
    return {
        require: 'form',
        link: function(scope, element, attrs, form) {
            form.$setUnsubmitted = function() {
                element.removeClass('ng-submitted');
                form.$submitted = false;
                if (form.$$parentForm.$setUnsubmitted) { // may be nullFormCtrl
                    form.$$parentForm.$setUnsubmitted();
                }
            };
        }
    };
});

如果 Angular 团队将来选择包含此方法,您只需删除此装​​饰器而不更改其他代码。

Plunk example here

【讨论】:

  • 很好,我唯一担心的是它在命名时模仿了原生的角度行为。如果在 $setUnsubmitted 存在的地方更新 angular 版本(这并非不可能),这将覆盖它,从而导致很多可能的混乱。我会考虑重命名它,您甚至可以添加一个子句来记录该方法现在存在并且应该删除脚本的消息。类似plnkr.co/edit/zg4isVLStZ2S2Edbg7c7?p=preview
  • 如果 Angular 团队要引入这种方法,命名是为了避免任何重大的重构。只需删除此自定义装饰器,无需对整个代码进行其他更改。我希望任何开发人员在升级之前检查对库的更改,但如果您担心忘记,您可以始终保留名称 并且 包含日志记录,因为装饰器在内置指令之后运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多