当前位置: 首页 > 面试题库 >

将表单重置为原始状态(AngularJS 1.0.x)

容俊豪
2023-03-14
问题内容

AngularJS 1.1.x的路线图上有一个将表单字段重置为原始状态(重置脏状态)的功能。不幸的是,当前的稳定版本中缺少此功能。

将AngularJS 1.0.x的所有表单字段重置为其初始原始状态的最佳方法是什么?

我想知道这是否可以通过指令或其他简单的解决方法来解决。我更喜欢一种无需接触原始AngularJS来源的解决方案。为了澄清和演示该问题,提供了指向JSFiddle的链接。http://jsfiddle.net/juurlink/FWGxG/7/

路线图 上有所需功能 -http :
//blog.angularjs.org/2012/07/angularjs-10-12-roadmap.html


功能要求
-https :
//github.com/angular/angular.js/issues/856
拟议的解决方案 拉取请求-https :
//github.com/angular/angular.js/pull/1127

更新了可能的解决方法

足够好的解决方法?

我只是想知道我可以重新编译HTML部分并将其放回DOM中。它可以工作,适合临时解决方案,也可以使用@blesh注释中提到的方法:

控制器只能用于业务逻辑,不能用于DOM!

<div id="myform">
  <form class="form-horizontal" name="form">
  </form>
</div>

在我的控制器上resetForm()

  • 保存原始的原始HTML
  • 重新编译保存的原始HTML
  • 从DOM中删除当前表单
  • 将新的已编译模板插入DOM

JavaScript:

var pristineFormTemplate = $('#myform').html();
$scope.resetForm = function () {
    $('#myform').empty().append($compile(pristineFormTemplate)($scope));
}

问题答案:

我想出了一个使用AngularJS的解决方案,没有任何解决方法。这里的技巧是使用AngularJS功能来拥有多个具有相同名称的指令。

就像其他人提到的那样,实际上存在一个拉取请求(https://github.com/angular/angular.js/pull/1127),该请求进入了AngularJS
1.1.x分支,该分支允许重置表单。提交此拉取请求会更改ngModel和form /
ngForm指令(我希望添加一个链接,但是Stackoverflow不想让我添加两个以上的链接)。

现在,我们可以定义自己的ngModel和form / ngForm指令,并使用pull请求中提供的功能对其进行扩展。

我将这些指令包装在名为resettableForm的AngularJS模块中。您要做的就是将此模块包含到您的项目中,并且在这方面,AngularJS
1.0.x版的行为就像是Angular 1.1.x版一样。

“一旦您更新到1.1.x,您甚至不必更新代码,只需删除模块即可!”

该模块还通过所有添加到1.1.x分支中的表单重置功能html" target="_blank">测试。

您可以在我创建的jsFiddle(http://jsfiddle.net/jupiter/7jwZR/1/)中的示例中看到该模块的工作情况。

步骤1:在您的项目中包含resettableform模块

(function(angular) {

// Copied from AngluarJS
function indexOf(array, obj) {
  if (array.indexOf) return array.indexOf(obj);

  for ( var i = 0; i < array.length; i++) {
    if (obj === array[i]) return i;
  }
  return -1;
}

// Copied from AngularJS
function arrayRemove(array, value) {
  var index = indexOf(array, value);
  if (index >=0)
    array.splice(index, 1);
  return value;
}

// Copied from AngularJS
var PRISTINE_CLASS = 'ng-pristine';
var DIRTY_CLASS = 'ng-dirty';

var formDirectiveFactory = function(isNgForm) {
    return function() {
        var formDirective = {
            restrict: 'E',
            require: ['form'],
            compile: function() {
                return {
                    pre: function(scope, element, attrs, ctrls) {
                        var form = ctrls[0];
                        var $addControl = form.$addControl;
                        var $removeControl = form.$removeControl;
                        var controls = [];
                        form.$addControl = function(control) {
                            controls.push(control);
                            $addControl.apply(this, arguments);
                        }
                        form.$removeControl = function(control) {
                            arrayRemove(controls, control);
                            $removeControl.apply(this, arguments);
                        }
                        form.$setPristine = function() {
                            element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
                            form.$dirty = false;
                            form.$pristine = true;
                            angular.forEach(controls, function(control) {
                                control.$setPristine();
                            });
                        }
                    },
                };
            },
        };
        return isNgForm ? angular.extend(angular.copy(formDirective), {restrict: 'EAC'}) : formDirective;
    };
}
var ngFormDirective = formDirectiveFactory(true);
var formDirective = formDirectiveFactory();
angular.module('resettableForm', []).
    directive('ngForm', ngFormDirective).
    directive('form', formDirective).
    directive('ngModel', function() {
        return {
            require: ['ngModel'],
            link: function(scope, element, attrs, ctrls) {
                var control = ctrls[0];
                control.$setPristine = function() {
                    this.$dirty = false;
                    this.$pristine = true;
                    element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
                }
            },
        };
    });
})(angular);

步骤2:在您的控制器上提供一种重置模型的方法

请注意,重置表单时必须重置模型。在您的控制器中,您可以编写:

var myApp = angular.module('myApp', ['resettableForm']);

function MyCtrl($scope) {
    $scope.reset = function() {
        $scope.form.$setPristine();
        $scope.model = '';
    };
}

步骤3:将此方法包含在HTML模板中

<div ng-app="myApp">
<div ng-controller="MyCtrl">
<form name="form">
    <input name="requiredField" ng-model="model.requiredField" required/> (Required, but no other validators)
    <p ng-show="form.requiredField.$errror.required">Field is required</p>
    <button ng-click="reset()">Reset form</button>
</form>
<p>Pristine: {{form.$pristine}}</p>
</div>
</dvi>


 类似资料:
  • 我正在使用React-useState创建状态为的对象。在成功调用API后,将更新为数据对象。 我有一个表单可以更改此状态,但我还有一个取消按钮。单击“取消”时,如何将此状态恢复为其初始值(API调用后)? 我应该创建另一个状态变量和存储初始状态在那里,然后更新我的状态基于?

  • 问题内容: 我目前正在使用注册表单,以下是我的代码段: 每个状态都用于表格的受控输入。 本质上,我想做的是在用户成功注册后,希望状态恢复为初始状态,并清除字段。 手动将每个状态设置为空字符串是非常必要的,因为我想知道React是否附带有一种方法或函数可以将状态重置为初始值? 问题答案: 遗憾的是,没有内置的方法可以将状态设置为其初始值。 您的代码看起来不错,但是如果您想减少所需的功能,则可以将整个

  • 我目前正在处理一个注册表单,以下是我的代码片段: 每个状态都用于表单的受控输入。 基本上,我想做的是在用户成功注册后,我希望状态返回到初始状态,并清除字段。 在中手动将每个状态设置回空字符串是非常必要的。我想知道React是否有一个方法或函数可以将状态重置回初始值?

  • 原始状态是操作员在自己数据结构中保持的状态。当检查点为检查点时,它们只将一系列字节写入检查点。Flink对状态的数据结构一无所知,只看到原始字节。 然而,我没有找到任何例子来突出这种区别。有谁能提供一个最小的例子,在代码中明确区别吗?

  • 我正在尝试创建无状态安全性,从而将JWT令牌存储在Cookie而不是SESSION中。 问题是,如果没有会话,就不知道原始请求(在身份验证页面弹出之前)。所以在第77行这里savedRequest是空的。 这看起来很奇怪,我想我做错了什么。如何允许页面重定向到登录无状态会话后请求的原始URL? > 我禁用会话 然后,我创建了一个自定义的AuthenticationSuccessHandler,它扩

  • 我正在尝试使用mysqldump备份一个特定的表。我使用此批处理命令行执行此操作: 我在结果文件中收到的是这样的命令: 问题是,在这个场景中,表将在默认DB中创建,而不一定在我想要的DB中创建。我想要这样的东西: 我如何使用mysqldump来创建它呢?