|
153 | 153 | */ |
154 | 154 | this.showErrorMessage = true; |
155 | 155 |
|
156 | | - |
157 | 156 | /** |
158 | 157 | * Check form valid, return true |
159 | 158 | * checkValid(Form): Check the specific form(Form) valid from angular `$valid` |
|
277 | 276 |
|
278 | 277 | }); |
279 | 278 | }).call(this); |
280 | | - |
| 279 | + |
281 | 280 | (function() { |
282 | 281 | angular.module('validation.directive', ['validation.provider']) |
283 | 282 | .directive('validator', ['$injector', |
|
296 | 295 | * @param ctrl |
297 | 296 | * @returns {} |
298 | 297 | */ |
299 | | - var validFunc = function(element, validMessage, validation, callback, ctrl) { |
300 | | - var messageElem = element.next(), |
| 298 | + var validFunc = function(element, validMessage, validation, scope, ctrl) { |
| 299 | + var messageElem, |
301 | 300 | messageToShow = validMessage || $validationProvider.getDefaultMsg(validation).success; |
302 | 301 |
|
| 302 | + if (scope.messageId) |
| 303 | + messageElem = angular.element(document.querySelector('#' + scope.messageId)); |
| 304 | + else |
| 305 | + messageElem = element.next(); |
| 306 | + |
303 | 307 | if ($validationProvider.showSuccessMessage && messageToShow) { |
304 | 308 | messageElem.html($validationProvider.getSuccessHTML(messageToShow)); |
305 | 309 | messageElem.css('display', ''); |
306 | 310 | } else { |
307 | 311 | messageElem.css('display', 'none'); |
308 | 312 | } |
309 | 313 | ctrl.$setValidity(ctrl.$name, true); |
310 | | - if (callback) callback(); |
| 314 | + if (scope.validCallback) scope.validCallback(); |
311 | 315 |
|
312 | 316 | return true; |
313 | 317 | }; |
|
322 | 326 | * @param ctrl |
323 | 327 | * @returns {} |
324 | 328 | */ |
325 | | - var invalidFunc = function(element, validMessage, validation, callback, ctrl) { |
326 | | - var messageElem = element.next(), |
| 329 | + var invalidFunc = function(element, validMessage, validation, scope, ctrl) { |
| 330 | + var messageElem, |
327 | 331 | messageToShow = validMessage || $validationProvider.getDefaultMsg(validation).error; |
328 | 332 |
|
| 333 | + if (scope.messageId) |
| 334 | + messageElem = angular.element(document.querySelector('#' + scope.messageId)); |
| 335 | + else |
| 336 | + messageElem = element.next(); |
| 337 | + |
329 | 338 | if ($validationProvider.showErrorMessage && messageToShow) { |
330 | 339 | messageElem.html($validationProvider.getErrorHTML(messageToShow)); |
331 | 340 | messageElem.css('display', ''); |
332 | 341 | } else { |
333 | 342 | messageElem.css('display', 'none'); |
334 | 343 | } |
335 | 344 | ctrl.$setValidity(ctrl.$name, false); |
336 | | - if (callback) callback(); |
| 345 | + if (scope.inValidCallback) scope.inValidCallback(); |
337 | 346 |
|
338 | 347 | return false; |
339 | 348 | }; |
|
367 | 376 | expression = $validationProvider.getExpression(validator), |
368 | 377 | valid = { |
369 | 378 | success: function() { |
370 | | - validFunc(element, attrs[successMessage], validator, scope.validCallback, ctrl); |
| 379 | + validFunc(element, attrs[successMessage], validator, scope, ctrl); |
371 | 380 | if (leftValidation.length) { |
372 | 381 | checkValidation(scope, element, attrs, ctrl, leftValidation, value); |
373 | 382 | } else { |
374 | 383 | return true; |
375 | 384 | } |
376 | 385 | }, |
377 | 386 | error: function() { |
378 | | - return invalidFunc(element, attrs[errorMessage], validator, scope.invalidCallback, ctrl); |
| 387 | + return invalidFunc(element, attrs[errorMessage], validator, scope, ctrl); |
379 | 388 | } |
380 | 389 | }; |
381 | 390 |
|
|
402 | 411 | } |
403 | 412 | // Check with RegExp |
404 | 413 | else if (expression.constructor === RegExp) { |
405 | | - return $validationProvider.getExpression(validator).test(value) ? valid.success() : valid.error(); |
| 414 | + // Only apply the test if the value is neither undefined or null |
| 415 | + if (value !== undefined && value !== null) |
| 416 | + return $validationProvider.getExpression(validator).test(value) ? valid.success() : valid.error(); |
| 417 | + else |
| 418 | + return valid.error(); |
406 | 419 | } else { |
407 | 420 | return valid.error(); |
408 | 421 | } |
|
427 | 440 | model: '=ngModel', |
428 | 441 | initialValidity: '=initialValidity', |
429 | 442 | validCallback: '&', |
430 | | - invalidCallback: '&' |
| 443 | + invalidCallback: '&', |
| 444 | + messageId: '@' |
431 | 445 | }, |
432 | 446 | link: function(scope, element, attrs, ctrl) { |
433 | 447 |
|
|
454 | 468 | */ |
455 | 469 | var uid = ctrl.validationId = guid(); |
456 | 470 |
|
457 | | - /** |
458 | | - * Valid/Invalid Message |
459 | | - */ |
460 | | - element.after('<span></span>'); |
461 | 471 |
|
462 | 472 | /** |
463 | 473 | * Set initial validity to undefined if no boolean value is transmitted |
|
467 | 477 | initialValidity = scope.initialValidity; |
468 | 478 | } |
469 | 479 |
|
| 480 | + /** |
| 481 | + * Default Valid/Invalid Message |
| 482 | + */ |
| 483 | + if (!scope.messageId) |
| 484 | + element.after('<span></span>'); |
| 485 | + |
470 | 486 | /** |
471 | 487 | * Set custom initial validity |
472 | 488 | * Usage: <input initial-validity="true" ... > |
|
491 | 507 | ctrl.$setPristine(); |
492 | 508 | ctrl.$setValidity(ctrl.$name, undefined); |
493 | 509 | ctrl.$render(); |
494 | | - element.next().html(''); |
| 510 | + if (scope.messageId) |
| 511 | + angular.element(document.querySelector('#' + scope.messageId)).html(''); |
| 512 | + else |
| 513 | + element.next().html(''); |
495 | 514 | }); |
496 | 515 |
|
497 | 516 | /** |
|
574 | 593 | ctrl.$setViewValue(ctrl.$viewValue); |
575 | 594 | } else if (ctrl.$pristine) { |
576 | 595 | // Don't validate form when the input is clean(pristine) |
577 | | - element.next().html(''); |
| 596 | + if (scope.messageId) |
| 597 | + angular.element(document.querySelector('#' + scope.messageId)).html(''); |
| 598 | + else |
| 599 | + element.next().html(''); |
578 | 600 | return; |
579 | 601 | } |
580 | 602 | checkValidation(scope, element, attrs, ctrl, validation, value); |
|
587 | 609 | * Don't showup the validation Message |
588 | 610 | */ |
589 | 611 | attrs.$observe('noValidationMessage', function(value) { |
590 | | - var el = element.next(); |
| 612 | + var el; |
| 613 | + if (scope.messageId) |
| 614 | + el = angular.element(document.querySelector('#' + scope.messageId)); |
| 615 | + else |
| 616 | + el = element.next(); |
591 | 617 | if (value == 'true' || value === true) { |
592 | 618 | el.css('display', 'none'); |
593 | 619 | } else if (value == 'false' || value === false) { |
|
0 commit comments