添加$ setPristine()

时间:2018-07-18 15:41:21

标签: angularjs

将$ setPristine()添加到函数中时,我的项目中发生了一些意外的行为。

这是一个工作的JSFiddle,它演示了该行为: http://jsfiddle.net/knot22/2x4yt0vb/21/

这是HTML:

<html ng-app="myApp">
<div ng-controller="formulaCtrlr as vm" >
<form name="vm.formContainer.form" autocomplete="off">
                          <div class="form-group" ng-class="{'has-error': vm.formContainer.form.FatA.$dirty && vm.formContainer.form.FatA.$invalid}">
                            <label for="FatA" class="col-sm-2 control-label">Fat A</label>
                            <input name="FatA" type="text" class="form-control col-sm-10 input-sm" ng-required="true" ng-model-options="{updateOn: 'blur'}" ui-validate="{numberCheck: 'vm.numberCheck($value)', fatRangeCheck: 'vm.fatRangeCheck($value)'}" ng-model="vm.formulaInput.Fats[0]" /><span>%</span>
                            <span class="error" ng-show="vm.formContainer.form.FatA.$dirty && vm.formContainer.form.FatA.$invalid">Invalid entry.</span>
                            <span class="error" ng-show="vm.formContainer.form.FatA.$dirty && vm.formContainer.form.FatA.$error.numberCheck">{{vm.errorMessages.numberCheck}}</span>
                            <span class="error" ng-show="vm.formContainer.form.FatA.$dirty && vm.formContainer.form.FatA.$error.fatRangeCheck">{{vm.errorMessages.fatRangeCheck}}</span>
                        </div>
                        <div class="form-group" ng-class="{'has-error': vm.formContainer.form.FatB.$dirty && vm.formContainer.form.FatB.$invalid}">
                            <label for="FatB" class="col-sm-2 control-label">Fat B</label>
                                <input name="FatB" type="text" class="form-control col-sm-10 input-sm" ng-required="true" ng-model-options="{updateOn: 'blur'}" ui-validate="{numberCheck: 'vm.numberCheck($value)', fatRangeCheck: 'vm.fatRangeCheck($value)'}" ng-model="vm.formulaInput.Fats[1]" /><span>%</span>
                                <span class="error" ng-show="vm.formContainer.form.FatB.$dirty && vm.formContainer.form.FatB.$invalid">Invalid entry.</span>
                                <span class="error" ng-show="vm.formContainer.form.FatB.$dirty && vm.formContainer.form.FatB.$error.numberCheck">{{vm.errorMessages.numberCheck}}</span>
                                <span class="error" ng-show="vm.formContainer.form.FatB.$dirty && vm.formContainer.form.FatB.$error.fatRangeCheck">{{vm.errorMessages.fatRangeCheck}}</span>
                        </div>
                            <div class="col-sm-offset-2">
                                <input type="reset" value="Clear" class="btn btn-default" ng-click="vm.clear()" ng-disabled="vm.formContainer.form.$pristine" />
                            </div>                        
</form>
        <div>formula input: {{vm.formulaInput}}</div>
</div>        
</html>

这是JS / AngularJS:

angular.module('myApp', ['ui.validate'])
    .controller("formulaCtrlr", ['$scope', function ($scope) {
            var vm = this;

        vm.formContainer = {
            form: {}
        }

        vm.formulaInput = {};
        vm.formulaInput.Fats = [];

        vm.clear = function () {            
            vm.formulaInput.Fats = [];
            //vm.formContainer.form.$setPristine();
        }

        vm.errorMessages = {
            numberCheck: 'Value must be a number.',
            fatRangeCheck: 'Number must be between 0 and 100.'
        }

        vm.numberCheck = function (value) {
            var result = !(isNaN(parseFloat(value)));
            return result;
            //return !(isNaN(parseFloat(value)));
        }       

        vm.fatRangeCheck = function (value) {
            var result = (value && value > 0.0 && value < 100.0);
            return result;
            //return (value && value > 0.0 && value < 100.0);
        }               

  }]);

如果用户在第一个输入框中键入abc,在第二个输入框中键入-20,则会出现验证错误消息,这与预期的一样。当用户单击清除按钮时,输入框的内容将被删除,但仍然显示验证错误。目的是清除输入框,并在用户单击清除时删除验证错误消息。似乎添加$ setPristine()可以实现此目的。但是...

演示意外行为:

  1. 启用//vm.formContainer.form.$setPristine();
  2. 点击运行
  3. 在第一个输入框中输入abc,在第二个输入框中输入-20
  4. 点击清除按钮

验证错误消失了,这很好,但是输入框仍然包含abc和-20;这是意外的行为。为什么不删除输入框的值?

1 个答案:

答案 0 :(得分:0)

这里是JSFiddle的链接,现在可以使用$ setPristine()进行工作: http://jsfiddle.net/knot22/rxqh8jtc/42/

这是相关的部分:

vm.clear = function () {            
    vm.formulaInput = {};
    vm.formulaInput.Fats = [];
    vm.formContainer.form.FatA.$setPristine();
    vm.formContainer.form.FatB.$setPristine();
}