Я делаю это с помощью комбинации formlyValidationMessages и fieldWrapper. Первоначальная конфигурация довольно сложная, но приводит к довольно гибкой системе проверки, которая позволяет обрабатывать синхронные и асинхронные ошибки проверки одинаково. Большая часть этой почты была вымощена букетом от официального async Validation example.
formlyValidationMessages позволяет настроить некоторые сообщения об ошибках по умолчанию для типичных ошибок проверки. Вот пример я использую в своих проектах
angular.module('myModule', ['formly']).run(formlyValidationMessages){
formlyValidationMessages.messages.required = 'to.label + " is required"'
formlyValidationMessages.messages.max = '"The max value allowed is " + to.max'
formlyValidationMessages.messages.min = '"The min value allowed is " + to.min'
}
Это Formly Expressions так что они могут быть строками или функции.
Это в основном устанавливает часы на свойство ошибки полей в угловой форме. Если это ошибка в форме для поля (например, form.field.$error.required === true
), она добавит max к validation.messages в ваш объект конфигурации поля.
Если вам нужна конкретная ошибка для определенного поля, вы можете добавить ее в определение поля. например
var field = {
key: 'serialNumber',
type: 'input'
....
validation: {
messages: {
unique: function() {
return 'Serial number 123 is not unique'
}
}
}
asyncValidators: {
unique: {
expression: function(modelValue, viewValue, scope) {
return $timeout(
function(){
if(modelValue === '123') {
throw 'unique failure: 123' //throw to reject promise
}
},
1000
)
}
}
}
}
Для отображения этого пользователя, создать hasError оболочку для ваших полей, которые используют ngMessages для создания каждого поля списка ошибок для ваших полей.
module.config(function(formlyConfigProvider) {
formlyConfigProvider.setWrapper({
name: 'hasError',
template: '<div class="form-group" ng-class="{\'has-error\': showError}">' +
' <label class="control-label" for="{{id}}">{{to.label}}</label>' +
' <formly-transclude></formly-transclude>' +
' <div ng-messages="fc.$error" ng-if="showError" class="text-danger">' +
' <div ng-message="{{ ::name }}" ng-repeat="(name, message) in ::options.validation.messages" class="message">{{ message(fc.$viewValue)}}</div>' +
' </div>' +
'</div>'
})
})
Here is a plunker, что имеет функционирующий пример с использованием начальной загрузки укладки. Если вы введете 123, вы получите асинхронную ошибку проверки, но если вы оставите ее пустой, вы получите синхронную.
Надеюсь, вы нашли ответ раньше, просто хотели записать способ, так как я наткнулся на этот вопрос. –