Угловая проверка в <select> с подсказкой

У меня есть следующий код для ввода выпадающего списка, созданного в Bootstrap.

<select class="form-control" name="businessprocess" ng-model="businessprocess" required>
    <option value="">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

Прежде чем пользователь сможет отправить эту форму, он или она должны выбрать бизнес-процесс.

Итак, я поместил директиву required в оператор select, однако, поскольку первый тег параметра имеет -- Select Business Process --, который все еще считается выбранным параметром, и, следовательно, требуемый флаг выполняется, и поэтому форма проверяется, хотя фактический бизнес-процесс не выбран.

Как я могу решить эту проблему?

Спасибо.

Ответы

Ответ 1

Этот подход может/должен решить вашу проблему:

1) объявите параметры внутри вашей области:

$scope.processes = [
    { code: "C", name: "Process C" },
    { code: "Q", name: "Process Q" }
];

И 2) использовать эту декларацию:

<select class="form-control" name="businessprocess" ng-model="businessprocess" required
    ng-options="c.code as c.name for c in processes" >
    <option value="">-- Select Business Process --</option>
</select>

Дело в том, что во время угловых циклов, во-первых, будет решена проблема, связанная с тем, что текущее значение не входит в число вариантов processes. Таким образом, по умолчанию будет установлено:

<option value="">-- Select Business Process --</option>

и required будет работать, как ожидалось (более подробная информация)

Ответ 2

вы можете ввести значение селектора в контроллере:

<select class="form-control" name="businessprocess" ng-model="businessprocess">
    <option value="A">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

в контроллере:

$scope.businessprocess = "A" ;

или "C", "Q", независимо от того, что вы хотите, поэтому выбор всегда будет иметь значение. Я думаю, что вам не нужно "нужно" здесь, в select.

Если вы не хотите, чтобы значение init. также делают некоторые дополнительные эффекты, когда пользователь не выбирает его.

<select class="form-control" name="businessprocess" ng-model="businessprocess" myRequired>
    <option value="">-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

тогда напишите директиву:

model.directive("myRequired", function() {
    return {
        restrict: 'AE',
        scope: {},
        require: 'ngModel',
        link: function(scope, iElement, iAttrs) {
                if(iElement.val() == ""){
                    //do something
                    return;
                } else {
                    //do other things
                }
            });
        }
    };
});

Ответ 3

JS



    angular.module('interfaceApp')
  .directive('requiredSelect', function () {
    return {
      restrict: 'AE',
      require: 'ngModel',
      link: function(scope, elm, attr, ctrl) {

        if (!ctrl) return;
          attr.requiredSelect = true; // force truthy in case we are on non input element

          var validator = function(value) {
            if (attr.requiredSelect && ctrl.$isEmpty(value)) {
              ctrl.$setValidity('requiredSelect', false);
              return;
            } else {
              ctrl.$setValidity('requiredSelect', true);
              return value;
            }
          };

          ctrl.$formatters.push(validator);
          ctrl.$parsers.unshift(validator);

          attr.$observe('requiredSelect', function() {
            validator(ctrl.$viewValue);
          });
      }
    };
  });


Ответ 4

лучший способ и прямой - использовать:

HTML

<select name="businessprocess" ng-model="businessprocess"  required>
        <option selected disabled value="">-- Select Business Process --</option>
        <option ng-repeat="v in processes" value="{{v.id}}">{{v.value}}</option>
</select>

Ответ 5

Вы можете попробовать добавить форму, например:

HTML

<div ng-app="myApp" ng-controller="MyCtrl">
     <form name="mainForm">
    <select name="businessprocess" ng-model="businessprocess"  required>    
        <option value="">-- Select Business Process --</option>
        <option ng-repeat="v in processes" value="{{v.id}}">{{v.value}}</option>
    </select>
    <span class="error" ng-show="mainForm.businessprocess.$error.required">required</span>
</form>
</div>

JS

angular.module('myApp', []);

function MyCtrl($scope, $timeout) {
   $scope.processes = [{
        id: "C",
        value: "Process C"
    }, {
        id: "Q",
        value: "Process Q"
    }];
}

Демо Fiddle

Ответ 6

Добавьте "отключено" к первому варианту:

<select class="form-control" name="businessprocess" ng-model="businessprocess" required>
<option value="" disabled>-- Select Business Process --</option>
<option value="C">Process C</option>
<option value="Q">Process Q</option>

Ответ 7

Используйте следующий фрагмент кода

<select class="form-control" name="businessprocess" ng-model="businessprocess">
    <option value="A" disabled selected hidden>-- Select Business Process --</option>
    <option value="C">Process C</option>
    <option value="Q">Process Q</option>
</select>

Ответ 8

Это работает для меня. Форма недействительна, пока пользователь не выберет любое другое значение, кроме "Выбрать..."

<select name="country" id="country" class="form-control" formControlName="country" required>
    <option selected value="">Choose...</option>
    <option *ngFor="let country of countries">{{country.country}}</option>
</select>

Ответ 9

Возможно, этот код может быть полезен для этого... в этом случае форма называется myform

<select ng-model="selectX" id="selectX" name="selectX"  required>
                                            <option  value="" ></option>
                                            <option  value="0" >0</option>
                                            <option value="1">1</option>
                                          </select>

    <span style="color:red" ng-show="myform.selectX.$dirty && myform.selectX.$invalid">
    <span ng-show="myform.selectX.$error.required">Is required.</span>
    </span>