@@ -24,45 +24,66 @@ var jqLite = angular.element;
24
24
* `ngMessage` and `ngMessageExp` directives.
25
25
*
26
26
* # Usage
27
- * The `ngMessages` directive listens on a key/value collection which is set on the ngMessages attribute.
28
- * Since the {@link ngModel ngModel} directive exposes an `$error` object, this error object can be
29
- * used with `ngMessages` to display control error messages in an easier way than with just regular angular
30
- * template directives.
27
+ * The `ngMessages` directive allows keys in a key/value collection to be associated with a child element
28
+ * (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use
29
+ * case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the
30
+ * {@link ngModel ngModel} directive.
31
+ *
32
+ * The child elements of the `ngMessages` directive are matched to the collection keys by a `ngMessage` or
33
+ * `ngMessageExp` directive. The value of these attributes must match a key in the collection that is provided by
34
+ * the `ngMessages` directive.
35
+ *
36
+ * Consider the following example, which illustrates a typical use case of `ngMessages`. Within the form `myForm` we
37
+ * have a text input named `myField` which is bound to the scope variable `field` using the {@link ngModel ngModel}
38
+ * directive.
39
+ *
40
+ * The `myField` field is a required input of type `email` with a maximum length of 15 characters.
31
41
*
32
42
* ```html
33
43
* <form name="myForm">
34
44
* <label>
35
45
* Enter text:
36
- * <input type="text " ng-model="field" name="myField" required minlength="5 " />
46
+ * <input type="email " ng-model="field" name="myField" required maxlength="15 " />
37
47
* </label>
38
48
* <div ng-messages="myForm.myField.$error" role="alert">
39
- * <div ng-message="required">You did not enter a field</div>
40
- * <div ng-message="minlength, maxlength">
41
- * Your email must be between 5 and 100 characters long
42
- * </div>
49
+ * <div ng-message="required">Please enter a value for this field.</div>
50
+ * <div ng-message="email">This field must be a valid email address.</div>
51
+ * <div ng-message="maxlength">This field can be at most 15 characters long.</div>
43
52
* </div>
44
53
* </form>
45
54
* ```
46
55
*
47
- * Now whatever key/value entries are present within the provided object (in this case `$error`) then
48
- * the ngMessages directive will render the inner first ngMessage directive (depending if the key values
49
- * match the attribute value present on each ngMessage directive). In other words, if your errors
50
- * object contains the following data:
56
+ * In order to show error messages corresponding to `myField` we first create an element with an `ngMessages` attribute
57
+ * set to the `$error` object owned by the `myField` input in our `myForm` form.
58
+ *
59
+ * Within this element we then create separate elements for each of the possible errors that `myField` could have.
60
+ * The `ngMessage` attribute is used to declare which element(s) will appear for which error - for example,
61
+ * setting `ng-message="required"` specifies that this particular element should be displayed when there
62
+ * is no value present for the required field `myField` (because the key `required` will be `true` in the object
63
+ * `myForm.myField.$error`).
64
+ *
65
+ * ### Message order
66
+ *
67
+ * By default, `ngMessages` will only display one message for a particular key/value collection at any time. If more
68
+ * than one message (or error) key is currently true, then which message is shown is determined by the order of messages
69
+ * in the HTML template code (messages declared first are prioritised). This mechanism means the developer does not have
70
+ * to prioritise messages using custom JavaScript code.
71
+ *
72
+ * Given the following error object for our example (which informs us that the field `myField` currently has both the
73
+ * `required` and `email` errors):
51
74
*
52
75
* ```javascript
53
76
* <!-- keep in mind that ngModel automatically sets these error flags -->
54
- * myField.$error = { minlength : true, required : true };
77
+ * myField.$error = { required : true, email : true, maxlength: false };
55
78
* ```
79
+ * The `required` message will be displayed to the user since it appears before the `email` message in the DOM.
80
+ * Once the user types a single character, the `required` message will disappear (since the field now has a value)
81
+ * but the `email` message will be visible because it is still applicable.
56
82
*
57
- * Then the `required` message will be displayed first. When required is false then the `minlength` message
58
- * will be displayed right after (since these messages are ordered this way in the template HTML code).
59
- * The prioritization of each message is determined by what order they're present in the DOM.
60
- * Therefore, instead of having custom JavaScript code determine the priority of what errors are
61
- * present before others, the presentation of the errors are handled within the template.
83
+ * ### Displaying multiple messages at the same time
62
84
*
63
- * By default, ngMessages will only display one error at a time. However, if you wish to display all
64
- * messages then the `ng-messages-multiple` attribute flag can be used on the element containing the
65
- * ngMessages directive to make this happen.
85
+ * While `ngMessages` will by default only display one error element at a time, the `ng-messages-multiple` attribute can
86
+ * be applied to the `ngMessages` container element to cause it to display all applicable error messages at once:
66
87
*
67
88
* ```html
68
89
* <!-- attribute-style usage -->
0 commit comments