0

I triying to display/hide my ng-messages div only when the field in target is dirty and contain an error...

I have this ng-messages wrapper :

<div class="alert-bloc red clearfix" data-icon="warning-white" ng-if="changePwd.$dirty" ng-hide="hideMe" ng-messages="changePwd.$invalid" ng-messages-multiple>
    <div>
        <p ng-message="required">Votre nouveau mot de passe est requis</p>
        <p ng-message="minlength">Votre nouveau mot de passe est trop court</p>
        <p ng-message="pattern">Votre nouveau mot de passe doit intégrer au moins une majuscule, une minuscule et un chiffre</p>
        <p ng-message="different">{{ errorMsg }}</p>
        <p ng-message="mirror">{{ errorMsg }}</p>
    </div>
</div>

My form is :

<form role="form" name="changePwd" novalidate autocomplete="off">
    <div>
        <label>Votre ancien mot de passe :
            <input type="password" name="o" ng-model="credentials.o" ng-change="controleChangePassword(credentials);" required onpaste="return false;"/>
        </label>
    </div>
    <div ng-show="changePwd.o.$dirty">
        <label >Votre nouveau mot de passe :
            <input type="password" name="p1" ng-model="credentials.p1" ng-change="controleChangePassword(credentials);" ng-minlength="8" ng-pattern="/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/" required onpaste="return false;"/>
        </label>

        <label>Confirmez votre nouveau mot de passe :
            <div>
                <input type="password" name="p2" ng-model="credentials.p2" ng-change="controleChangePassword(credentials);" required onpaste="return false;" />
            </div>
        </label>
    </div>

    <button type="button" ng-disabled="changePwd.$invalid || disabled" ng-click="updatePassword(credentials);">Valider</button>
</form>     

In my case, the div ng-messages container showing when any field is $dirty and when the form(changePwd) is $invalid.

I would like the ng-messages show only when the focus field is dirty and invalid, not when the global form is dirty.

For example, when I start writing something in the inpu(o), the ng-messages showing...

ng-messages show when it shouldn't

Is there some thing I did wrong ?

Kévin Vilela Pinto
  • 326
  • 1
  • 6
  • 21

3 Answers3

0

Instead of checking if form is dirty you can check if individual fields are dirty and invalid/error. Something like

<div class="alert-bloc red clearfix" data-icon="warning-white" ng-hide="hideMe" ng-messages="(changePwd.o.$dirty && chagePwd.o.$error) || (changePwd.p1.$dirty && chagePwd.p1.$error) || (changePwd.p2.$dirty && chagePwd.p2.$error)" ng-messages-multiple>
  <div>
    <p ng-message="required">Votre nouveau mot de passe est requis</p>
    <p ng-message="minlength">Votre nouveau mot de passe est trop court</p>
    <p ng-message="pattern">Votre nouveau mot de passe doit intégrer au moins une majuscule, une minuscule et un chiffre</p>
    <p ng-message="different">{{ errorMsg }}</p>
    <p ng-message="mirror">{{ errorMsg }}</p>
  </div>
</div>
Bharat
  • 943
  • 7
  • 9
0

try this

    <md-input-container class="md-block">
                <label>Client Name</label>
                <input required name="clientName" ng-model="project.clientName">
                <div ng-messages="projectForm.clientName.$error" ng-if="projectForm.clientName.$touched">
                  <div ng-style="projectForm.clientName.$error.required ? { 'display ' : 'block' } : {'display' : 'none'} " ng-message="required">This is required.</div>
                </div>
     </md-input-container>
Vesper
  • 375
  • 1
  • 8
  • 14
0
<div class="login">
<h1>Login to Web App</h1>

<form name="loginForm">
    <p ng-bind="msg"></p>

    <p>
        <input name="username" type="email" ng-model="obj.username" ng-pattern="/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/"
               required>
    </p>

    <div ng-messages="loginForm.username.$dirty && loginForm.username.$error">
        <div ng-message="required">You forgot to enter your email address...</div>
        <span ng-message="pattern">Please enter a valid email address!</span>
    </div>
    <p><input type="password" ng-model="loginForm.password" name="password" value="" placeholder="Password"
              required></p>

    <div ng-messages="loginForm.password.$dirty && loginForm.password.$error">
        <p ng-message="required">Required!</p>
    </div>


    <p class="submit"><input ng-click="signIn()" ng-disabled="!loginForm.$valid" type="submit" name="commit"
                             value="Login"></p>
</form>

Try this one...

Ravi
  • 2,360
  • 1
  • 15
  • 11