cp-валидация работает не так, как ожидалось
Я интегрирую cp-validaiton
с моим приложением Ember. но я не получаю никакого ответа. любой поможет мне здесь.
мой маршрут JS:
import Ember from 'ember';
import Validations from '../validation'
export default Ember.Route.extend(Validations, {
num:null,
message: '',
model(){
return { num:null}
},
actions:{
check(){
this.set('message','');
this.validate().then(({model, validations})=>{
if(validations.get('isValid')){
console.log('statge', validations.get('isValid') )
this.set('message','');
}else{
if(model.get('validations.attrs.num.isInvalid')){
this.set('message',model.get('validations.attrs.num.messages'));
}
}
})
}
}
});
мой validation.js:
import { validator, buildValidations } from 'ember-cp-validations';
export default buildValidations({
num: [
validator('number',{
allowString: true,
integer: true,
message: 'Error! This is not an integer!'
}),
validator('presence', true)
]
});
шаблон:
<h1>This is my Route</h1>
Enter Age:<br>
{{input value=model.num}}<br>
<div style='color: red'>{{message}}<br></div>
<button {{action 'check'}}>Check</button><br>
1 ответ
Проверки должны быть определены для объекта данных, который, в вашем случае, является не атрибутом Маршрута, а моделью базового Контроллера. Модель контроллера установлена самим Эмбер в setupControler()
Крюк Маршрута.
Таким образом, мы используем подход "вложенные ключи" для целевых проверок, установленных на правильных данных:
import { validator, buildValidations } from 'ember-cp-validations';
export default buildValidations({
'controller.model.num': [
validator('number',{
allowString: true,
integer: true,
//message: 'Error! This is not an integer!'
}),
validator('presence', true)
]
});
Примечание: определение атрибута
export default Ember.Route.extend(Validations, {
num:null, // this is not used, just confusing :)
message: '',
....
}
является ненужным и запутанным, поскольку не используется, не стесняйтесь удалить его.
Проверка достоверности / ошибок и т. Д. На основе атрибутов может быть достигнута следующим образом:
model.get('validations.attrs.controller.model.num.isValid');
model.get('validations.attrs.controller.model.num.errors');
model.get('validations.attrs.controller.model.num.messages');
Ваш маршрут будет выглядеть так:
import Ember from 'ember';
import Validations from '../validation'
export default Ember.Route.extend(Validations, {
model(){
return { num:null}
},
actions:{
check(){
this.set('controller.message','');
this.validate().then(({model, validations})=>{
if(validations.get('isValid')){
this.set('controller.message','');
}else{
if(model.get('validations.attrs.controller.model.num.isInvalid'){
this.set(
'controller.message',
model.get('validations.attrs.controller.model.num.messages.firstObject'));
}
}
})
}
}
});
Однако я настоятельно рекомендую перенести код, связанный с проверками, в модель, а не строить их в маршруте. Он более логичен, удобочитаем, позволяет уменьшить размер кода и соответствует тому, что вы найдете в документах ember-cp-validations.