Issue with angular material and ng-messages - angularjs

if I provoke 'min-length' error and then try to provoke 'required' error, the latter isn't shown, although the input is underlined in red.
<md-input-container class="md-block">
<label for="register_password">Password</label>
<input required minlength="6" maxlength="100" type="password" name="register_password" id="register_password" ng-model="registerData.password">
<div ng-messages="registerForm.register_password.$error">
<div ng-message="maxlength">The password should be shorter</div>
<div ng-message="minlength">The password should be at least 6 characters long</div>
<div ng-message="required">Required</div>
</div>
</md-input-container>
Full working example:
http://codepen.io/AndriusRimkus/pen/mPEjYX
Thanks!

You should use the following code
<md-input-container class="md-block">
<label for="register_password">Password</label>
<input required minlength="6" md-maxlength="100"
type="password" name="register_password"
id="register_password" ng-model="registerData.password">
<div ng-messages="registerForm.register_password.$error">
<div ng-message-exp="['required', 'minlength']">
The password shold be at least 6 characters long</div>
<!-- <div ng-message="minlength">The password should be at least 6 characters long</div> -->
<div ng-message="md-maxlength">The password should be shorter</div>
</div>
</md-input-container>
So there are many things you should consider. Since you are using angular material design I think you should use md-maxlength which will show a hint for how many charcters written against maxlength. I am not sure if there is any md-minlength directive is available. Now require and minlength is kind of same thing so I think you should combine those two as a single error message. Now There are some specific things releated to [ngMessages][1] check the documentaion for detail explation. I'll say couple of things about that. By default ngMessges only displays one error message and if there are more than 1 error message are valid then which ever comes first in DOM will be displayed. you can use multiple or ng-messages-multiple to display more than 1 error messages. I suggest you should write you error in incrementing order like required first followed by minlength(If you want to display it seperately) and at the end md-maxlength. You can use ng-message-exp to combine more than 1 error codes.

Your code is correct but there is one point.
You are using an old version of AngularJS Material.
If You change the last script with this lines then your code will be run properly.
<!-- Angular Material Library -->
<!-- Version 1.1.4 -->
<script src="https://material.angularjs.org/latest/angular-material.min.js"></script>
Check online
Good Luck

Related

$touched not working in Angularjs

I have the following line's of code. When I use $touched I still don't get the warning when I remove focus from the textarea. Can someone point out what I could be doing wrong here?
I am using angularjs v1.5
<textarea ng-model="ctrl.PendingRequest.BusinessJustification"
name="BusinessJustification"
class="form-control"
placeholder="Minimum of 10 characters"
ng-minLength="10"></textarea>
<div class="warning"
ng-if="!ctrl.check('BusinessJustification') && BusinessJustification.$touched">
Business justification is required
</div>

How to restrict input field length (max length) using <md-autocomplete>

I would like to achieve the behavior to restrict/limit users entr to only 10 numbers for ex:
Anyone know how to do this?
I do see that they have an attribute md-input-maxlength, but i am not able to get it work, or find an example.
Appreciate your inputs.
Extend from John Smith's answer, you can try
md-search-text-change="searchText = searchText.substring(0,10)"
I don't think there is currently an easy way to do it. However, as a hacky workaround you can use md-search-text-change and whenever the value is longer than X, you can just overwrite it with the first X characters of the value.
Example pen here
Keep in mind though, changing the text to a substring of it will cause another call for the text change event.
Combine 'md-maxlength' and 'maxlength'
eg.
input type="text" md-maxlength="512" maxlength="512"
Here's the working code:
<md-autocomplete flex=""
required
ng-init="searchText=''"
md-input-name="autocompleteAddField"
md-input-minlength="2"
md-input-maxlength="10"
md-no-cache="true"
md-selected-item="newE.add"
md-search-text="searchText"
md-items="item in vm.queryAddressSearch(searchText)"
md-item-text="item.address"
md-require-match=""
md-floating-label="Address">
<md-item-template>
<span md-highlight-text="searchText">{{item.address}}</span>
</md-item-template>
<div ng-messages="newEntityForm.autocompleteAddField.$error" ng-if="newEntityForm.autocompleteAddField.$touched">
<div ng-message="required">You <b>must</b> have a user address.</div>
<div ng-message="md-require-match">Please select an existing address.</div>
<div ng-message="minlength">Your entry is not long enough.</div>
<div ng-message="maxlength">Your entry is too long.</div>
</div>
</md-autocomplete>
You can use ng-maxlength="10". Here is an example. If the user type more than 10 characters then the form will be invalid. You can check this out.
<form name="form">
<input type="text" ng-model="model" id="input" name="input" ng-maxlength="10" />
<hr>
input valid? = <code>{{form.input.$valid}}</code><br>
model = <code>{{model}}</code>
</form>

angularjs ng-show messes up form validation

I have an angularjs view with the following input field that is dependent on what organization the user is from..
<div class="form-group" ng-class="{'has-error': isDirtyAndInvalid(provisionVMForm.vmHostPrefix)}">
<label class="col-sm-2 control-label" for="vmHostPrefix">Host Prefix*</label>
<div class="col-sm-8">
<div ng-show="$root.sessionObj.org.name=='orgName1'>
<input id="vmHostPrefix" name="vmHostPrefix" class="form-control" type="text"
required="true"
ng-maxlength="12"
ng-minlength="12"
placeholder="Host Prefix"
ng-blur="setdirtyFromFocus(provisionVMForm.vmHostPrefix)"
ng-model="vmHostnamePrefix"/>
<div class="pull-left alert alert-danger form-validation-alert" role="alert"
ng-show="provisionVMForm.vmHostPrefix.$error.minlength ||
provisionVMForm.vmHostPrefix.$error.maxlength>
Host Prefix must be 12 characters long.
</div>
</div>
<div ng-show="$root.sessionObj.org.name=='orgName2'>
<input id="vmHostPrefix" name="vmHostPrefix" class="form-control" type="text"
required="true"
ng-maxlength="4"
ng-minlength="4"
placeholder="Host Prefix"
ng-blur="setdirtyFromFocus(provisionVMForm.vmHostPrefix)"
ng-model="vmHostnamePrefix"/>
<div class="pull-left alert alert-danger form-validation-alert" role="alert"
ng-show="provisionVMForm.vmHostPrefix.$error.minlength ||
provisionVMForm.vmHostPrefix.$error.maxlength>
Host Prefix must be 4 characters long.
</div>
</div>
</div>
</div>
What I need to do is identify what organization the user is currently in, and dependent the org, the hostname prefix input field can only be a certain length. Now, this works perfectly fine when I have just the first ng-show in my code. It correctly identifies the org name and the form complains if the input is less than or more than 12 characters. Whenever I add my second ng-show to identify my second organization.. my first organization form validation for org # 1 is not correct. The form only complains if the input IS 12 characters. I need it to be the opposite. Any ideas what I'm doing wrong by adding this second ng-show? I tried using ng-if when trying to identifiy the organization and that worked fine with the form validation.. but that resolves my vmHostPrefix variable to undefined in my controller. Any help is appreciated!
ng-show hides the element with display: none, while ng-if will remove the element from the DOM. I think what you have here is a bug caused by having 2 elements with ng-model pointing to the same variable.
Why not do this without repeating so much code and instead try using an expression in ng-minlength.
ng-minlength="$root.sessionObj.org.name==='orgName1' ? 12 : 4"
Or even better have ui state rules for the org
ng-minlength="$root.sessionObj.org.minlength"
ng-maxlength="$root.sessionObj.org.maxlength"
I believed they fixed expression evaluations for ng-min max in 1.3

ngMessages: how to access error details (such as minlength, field name, etc)?

How can my ngMessages access information about the form error? Such as field name and other properties?
Example:
I've seen many examples that look like this:
<input type="text" ng-model="field" name="myField" minlength="5">
<div ng-messages="myForm.myField.$error">
<div ng-message="minlength">The value entered is too short</div>
</div>
This is not a good error message because it doesn't tell the user how long the input should be. It just tells them it's too short.
It should render something like: "This field must be at least {{ minlength }} characters."
Even better: "{{ field }} must be at least {{ minlength }} characters."
Having to define a different message for inputs of different minlengths is extremely not-DRY.
How can this be done with ngMessages?
You could keep the minlength value on the scope and then bind to it in the validation message.
<input type="text" ng-model="field" name="myField" minlength="::myFieldMinlength">
<div ng-messages="myForm.myField.$error">
<div ng-message="minlength">This field must be at least {{::myFieldMinlength}} characters.</div>
</div>
I would do it the same as jayChase suggested. It's definitely easiest way and as he has suggested using single binding won't be bad performance wise

Angular Material 1.0 rc4 Form Validation Example

I have a few requirements for validating a form, and my attempts have been unsuccessful.
The form should validate as you fill it out. The md-input-container should be invalid if the validation requirements fail and the associated ngMessage should show. For example, if an input is marked as required it should turn red and show the message if you click into it and then move focus without typing anything.
The inputs should also be invalid if the form is submitted and they fail validation.
Here is what I've tried:
<md-input-container md-is-error="jac.application.$invalid && (jac.application.$submitted || jac.application.$dirty)" flex="20">
<label>Last Name</label>
<input type="text" name="last_name" ng-model="jac.application_object.last_name" required />
<div ng-messages="jac.application.last_name.$error">
<div ng-message="required">This is required.</div>
</div>
</md-input-container>
Using the above, submitting the form without entering anything has the desired effect; however, entering something valid into the input afterwards ONLY clears the ngMessage (the container is still red).
Also, the form doesn't validate as you fill it out.
Any suggestions on how I can achieve this?

Resources