2

I´m newbie in angular. I´m using angular-validator to validate the inputs in my application. I´m using ui-select plugin to display select list. I need is to validate if the user submitted a form & he didn't chosen an option in the select list then I'm gonna show required error message like the first input does in Plunkr. I believe that the validation is right but it doesn't show any error message, I've searched in the web but still no luck in R&D.

Any help would appreciated, Thanks in advance (Apologize for my Bad English)

Problem Plunkr

Pankaj Parkar
  • 134,766
  • 23
  • 234
  • 299
reds071286
  • 51
  • 1
  • 5

3 Answers3

3

There´s one directive that solve this, here´s the code:

app.directive('showErrors', function($timeout) {
return {
  restrict: 'A',
  require: '^form',
  link: function (scope, el, attrs, formCtrl) {
    // find the text box element, which has the 'name' attribute
    var inputEl   = el[0].querySelector("[name]");
    // convert the native text box element to an angular element
    var inputNgEl = angular.element(inputEl);
    // get the name on the text box
    var inputName = inputNgEl.attr('name');

    // only apply the has-error class after the user leaves the text box
    var blurred = false;
    inputNgEl.bind('blur', function() {
      blurred = true;
      el.toggleClass('has-error', formCtrl[inputName].$invalid);
    });

    scope.$watch(function() {
      return formCtrl[inputName].$invalid
    }, function(invalid) {
      // we only want to toggle the has-error class after the blur
      // event or if the control becomes valid
      if (!blurred && invalid) { return }
      el.toggleClass('has-error', invalid);
    });

    scope.$on('show-errors-check-validity', function() {
      el.toggleClass('has-error', formCtrl[inputName].$invalid);
    });

    scope.$on('show-errors-reset', function() {
      $timeout(function() {
        el.removeClass('has-error');
      }, 0, false);
    });
  }
}});

Here is the documentation: http://blog.yodersolutions.com/bootstrap-form-validation-done-right-in-angularjs/ and this is an example wiht ui-select: Plunkr

reds071286
  • 51
  • 1
  • 5
0

You are using form then validation tracking would easy in AngularJS by playing form variable. Do mention element of form as required and get error by doing like formName.attributeName.$error.required

Question isn't clear so there might be 2 ways can solve your problem.

  1. In ui-select when you use single select box at that time put required attribute on that select element, form will automatically gets invalid if you don't provide value for ui-select
  2. If you are using multiple select then the required attribute on element level won't help you (Github issue link). For solving this issue you need to add one directive that will provide validation of required

Directive

module.directive('uiSelectRequired', function() {
  return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
      ctrl.$validators.uiSelectRequired = function(modelValue, viewValue) {
        return modelValue && modelValue.length;
      };
    }
  };
});

Plunkr

Hope this could help you, Thanks.

Community
  • 1
  • 1
Pankaj Parkar
  • 134,766
  • 23
  • 234
  • 299
  • ok, thanks, i´m usign a single select box, and i mentioned, i think the validation is working, you can´t submit the form if you has not selected an element in the select box, but i don´t know how to show the required message like the first input is showing in the Plunkr – reds071286 Mar 06 '15 at 22:30
0

Try this, hope it will be helpful for you:

<div class="form-group col-md-3" style="margin-left:50px" ng-class="{'has-error': datosDeUbicacion.$submitted && datosDeUbicacion.viviendas.$invalid}">
        <label class="control-label" for="tipoViviendas">TIPO DE VIVIENDA</label>
        <ui-select name="viviendas" ng-model="viviendas.selected" class="form-control" theme="select2" reset-search-input="true" required>
          <ui-select-match placeholder="Selecciona">{{$select.selected.nombre}}</ui-select-match>
          <ui-select-choices repeat="item in tipoViviendas | filter: $select.search">
            <div ng-bind-html="item.nombre | highlight: $select.search"></div>
          </ui-select-choices>
        </ui-select>
        <div ng-if="datosDeUbicacion.$submitted && datosDeUbicacion.viviendas.$error.required" class="help-block">
                   <div>This is required</div>
        </div>
</div>

Plunker

Mohamed dev
  • 172
  • 1
  • 8