2016-02-08 2 views
1

Я хочу установить 1 из 3 разных классов в диапазоне, основанный на результате функции. Кажется, что мой javascript возвращает правильное значение, однако моя разметка всегда показывает класс с требованием соответствия. Как я могу написать директиву ng-class, чтобы разместить это?Использование ng-класса с множественными условиями

HTML:

<span ng-class="{'require-empty': 0, 
           'require-matched': 1, 
           'require-not-matched':2 [form.username.$validators.status]}"> 
       </span> 

JS:

ctrl.$validators.status = function (value) { 
       var expression = /^[-\w]+$/; 

       if (value != null && value != undefined && value != '' && value != ' ') { 
        if (expression.test(value)) 
         return 1; 
        if (!expression.test(value)) 
         return 2; 
       } 
       else { 
        return 0; 
       } 
} 
+0

Это неправильное использование валидации в Угловом. 'ctrl. $ validators.status' должен возвращать значение boolean. – dfsq

+0

@dfsq Каков правильный способ справиться с этим? – noclist

+0

Дайте мне пять минут, чтобы подготовить полный пример того, что вам нужно. – dfsq

ответ

1

Это неправильное использование проверки в Угловом. ctrl.$validators.status должен возвращать значение boolean: true для действительного результата (required-matched в вашей терминологии) и false в противном случае (required-not-match). В случае недействительной проверки ngModelController получит булевский флаг, который вы можете использовать для управления стилем или показать сообщение об ошибке.

require-empty что вы должны обработать required валидатор вместо того, чтобы делатьвалидатор сделать это также.

Так что вы, вероятно, хотите иметь:

ctrl.$validators.status = function(value) { 
    if (value) { 
     var expression = /^[-\w]+$/; 
     return expression.test(value.trim()); 
    } 
    return false; 
} 

или директива может быть кратким

ctrl.$validators.status = function(value) { 
    return value && /^[-\w]+$/.test(value.trim()); 
} 

соответствующее поле в HTML будет (при условии, что имя директивы status):

<input type="text" name="test" ng-model="testModel" status required> 

<div class="error" ng-show="testForm.test.$error.required">The field is required.</div> 
<div class="error" ng-show="testForm.test.$error.status">The value should match pattern.</div> 

Demo:http://plnkr.co/edit/YALB4Vbi5FzNH5FCfwB5?p=preview

+0

Спасибо, не могли бы вы привести пример, используя ng-class вместо ng-show? По-прежнему возникают проблемы с определением, когда указать класс для моей разметки. –

+0

Вы действительно хотите эти классы? Я имею в виду, что вы автоматически получаете классы проверки, которые позволяют вам форматировать форму и поле так, как вы хотите. Это 'ng-invalid-status' (require-not-matching) и' ng-invalid-required' (require-empty). Состояние по умолчанию соответствует 'require-empty'. – dfsq

+0

Я пытаюсь создать элемент span с классами, которые предоставляют различный значок для каждого из трех состояний: значение пустое, значение соответствует выражению, значение не соответствует выражению. Поэтому мне нужны мои пользовательские классы, так как это не просто стиль поля формы в ошибке или действительном состоянии. –

Смежные вопросы