cp-validation无法按预期工作

时间:2017-08-21 05:40:43

标签: ember.js ember-cp-validations

我正在将cp-validaiton与我的余烬应用集成。但我没有得到任何回应。任何人都帮助我。

我的路线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>

Live in Twiddle

1 个答案:

答案 0 :(得分:2)

必须在数据对象上定义验证,在您的情况下,数据对象不是Route的属性,而是基础Controller的模型。控制器的模型由Ember本身设置在路线的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'));
         }
        }
      })
    }
  }
});

但是,我强烈建议您将与验证相关的代码迁移到模型,而不是在Route中构建它们。它更符合逻辑,更易读,可以减少代码的大小,并且符合您在ember-cp-validations docs中找到的内容。