Мерцание с ngMessages и ngShow

В форме с required-проверкой и ng-messages я использую ng-show, чтобы скрыть директиву при запуске и показывать сообщения об ошибках только после того, как ввод получил ng-dirty.

Чтобы элемент по-прежнему заполнял свое пространство в макете, у меня есть следующее правило css, чтобы перезаписать поведение ng-hide по умолчанию:

ng-messages.ng-hide:not(.ng-hide-animate), [ng-messages].ng-hide:not(.ng-hide-animate)
{
    display: block !important;
    visibility: hidden;
}

Когда я сейчас ввожу текст в поле ввода, сообщение об ошибке вскоре появляется, прежде чем оно снова скрывается (из-за заполнения обязательного поля). Почему-то кажется, что ng-dirty разрешается до того, как будет выполнена проверка формы, что приводит к такому поведению.

См. эту скрипту.

или проверить

Код:

var $scope;
var app = angular.module('myapp', ['ngMessages', 'ngAnimate']);
app.controller('UserCtrl', ['$scope', UserCtrl]);

function UserCtrl($scope) {
    $scope.showField = true;
    $scope.reset = function() {
        var master = { name: '' };
        $scope.temp = angular.copy(master);
        $scope.user_form.$setPristine();
    }  
}
ng-messages.ng-hide:not(.ng-hide-animate), [ng-messages].ng-hide:not(.ng-hide-animate)
{
   display: block !important;
   visibility: hidden;
}

ng-messages, [ng-messages]
{
  display: block;
  height: 1em;
}

input
{
   display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular-animate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-messages/1.5.5/angular-messages.min.js"></script>

<div ng-app="myapp">
    <div ng-controller="UserCtrl">
        <form name="user_form" novalidate>
            <input name="name" ng-model="temp.name" ng-show="showField" placeholder="Name" required autocomplete="off"/>
            <ng-messages ng-show="user_form.name.$dirty" for="user_form.name.$error">
              <ng-message when="required">
                Please enter your name
              </ng-message>
            </ng-messages>
            <button type="button" class="button" ng-click="reset()">Reset</button>     
        </form>
        <p>
            Pristine: {{user_form.$pristine}}
        </p>
        
        <pre>Errors: {{user_form.$error | json}}</pre>
              
    </div>
</div>


person Aides    schedule 25.04.2016    source источник


Ответы (1)


person    schedule
comment
Ога, это сработало! Я пробовал подобные вещи без успеха. Не могли бы вы объяснить, почему возникает это мерцание и как это утверждение помогает предотвратить его? - person Aides; 25.04.2016