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.

Другие вопросы по тегам