/**
@module bricksui
@submodule bricksui-form
*/
/**
#####[Ember.Validations更多内容查看...](https://github.com/dockyard/ember-validations)
#### 用法
需要将`Ember.Validations.Mixin`集成到任何你想要添加验证的控制器上
```javascript
var App.UserController = Ember.ObjectController.extend(Ember.Validations.Mixin);
```
需要定义一个validations对象作为控制器的一个属性,用来标识当前模型的验证规则.
对象的keys要一一映射模型的属性.如果你传入了一个JSON对象作为一个属性的值,则该值将被作为当前属性的验证规则.
如果你传入了`true`,则该属性将被标记为需要被验证的.如下:
```javascript
App.UserController.reopen({
validations: {
firstName: {
presence: true,
length: { minimum: 5 }
},
age: {
numericality: true
},
profile: true
}
});
```
#### 校验器
当前已经支持的校验器如下所示
##### Absence
验证属性值是`null`,`undefined` 或者是 `''`.
###### Options
* `true` - 设置为`true`将激活控制校验并且使用默认提示信息
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
```javascript
// Examples
absence: true
absence: { message: 'must be blank' }
```
##### Acceptance
默认可被接受的值为`'1'`, `1`, and `true`.
###### Options
* `true` - 设置为`true`将激活控制校验并且使用默认提示信息
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
* `accept` - 可被接受的值
```javascript
// Examples
acceptance: true
acceptance: { message: 'you must accept', accept: 'yes' }
```
##### Confirmation
相同值校验
###### Options
* `true` - 设置为`true`将激活控制校验并且使用默认提示信息
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
```javascript
// Examples
confirmation: true
confirmation: { message: 'you must confirm' }
```
##### Exclusion
排除校验
###### Options
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `in` - 被允许的数组
* `range` - 区间
```javascript
// Examples
exclusion: { in: ['Yellow', 'Black', 'Red'] }
exclusion: { range: [5, 10], allowBlank: true, message: 'cannot be between 5 and 10' }
```
##### Format
正则,格式化校验
###### Options
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `with` - 正则表达式
```javascript
// Examples
format: { with: /^([a-zA-Z]|\d)+$/, allowBlank: true, message: 'must be letters and numbers only' }
```
##### Inclusion
被允许的值
熬过校验
###### Options
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息.
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `in` - 被允许的数组
* `range` - 区间
```javascript
// Examples
inclusion: { in: ['Yellow', 'Black', 'Red'] }
inclusion: { range: [5, 10], allowBlank: true, message: 'must be between 5 and 10' }
```
##### Length
定义属性的长度
###### Options
* `number` - 跟`is`作用一样,长度必须时指定值
* `array` - 数组里面有两个值,第一个元素代表最小值,第二个元素达标最大值,即长度的区间
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `minimum` - 被允许的最小长度
* `maximum` - 被允许的最大长度
* `is` - 跟`number`作用一样,长度必须时指定值
* `tokenizer` - 校验时执行的自定以函数,返回一个代表长度的对象
###### Messages
* `tooShort` - 当不满足最小长度验证规则时,该错误信息将被应用显示,可覆盖默认的提示信息
* `tooLong` - t当不满足最大长度验证规则时,该错误信息将被应用显示,可覆盖默认的提示信息
* `wrongLength` - 当校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
```javascript
// Examples
length: 5
length: [3, 5]
length: { is: 10, allowBlank: true }
length: { minimum: 3, maximum: 5, messages: { tooShort: 'should be more than 3 characters', tooLong: 'should be less than 5 characters' } }
length: { is: 5, tokenizer: function(value) { return value.split(''); } }
```
##### Numericality
校验是否是一个数值
###### Options
* `true` -设置为`true`将激活控制校验并且使用默认提示信息
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `onlyInteger` - 只能是整数
* `greaterThan` - 一定要大于指定数
* `greaterThanOrEqualTo` - 一定要大于等于指定数
* `equalTo` - 一定要等于指定数
* `lessThan` - 一定要小于指定数
* `lessThanOrEqualTo` - 一定要小于等于指定数
* `odd` - 一定是奇数
* `even` - 一定是偶数
###### Messages
* `greaterThan` -当大于校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `greaterThanOrEqualTo` - 当大于等于校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `equalTo` - 当等于校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `lessThan` - 当小于校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `lessThanOrEqualTo` - 当小于等于校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `odd` - 当奇数校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
* `even` - 当偶数校验失败时,该错误信息将被应用显示,可覆盖默认的提示信息
```javascript
// Examples
numericality: true
numericality: { odd: true, messages: { odd: 'must be an odd number' } }
numericality: { onlyInteger, greaterThan: 5, lessThanOrEqualTo : 10 }
```
##### Presence
非空校验`null`, `undefined`, or `''`
###### Options
* `true` - 设置为`true`将激活控制校验并且使用默认提示信息
* `message` - 错误提示信息,可以如果提供了,将会覆盖默认的提示信息
```javascript
// Examples
presence: true
presence: { message: 'must not be blank' }
```
##### Uniqueness
*尚未实现*
##### URL
校验是否是一个URL.
###### Options
* `allowBlank` - 如果设置为`true`,值为空将跳过校验
* `allowIp` - 如果设置为`true`,将使用IP地址进行校验URL,IP地址默认是非法的
* `allowUserPass` - 如果设置为`true`,将校验URL是否有用户名和密码,默认情况是不允许用户名和密码
* `allowPort` - 如果设置为`true`,将校验URL是否带有端口号,默认情况是不允许有端口号
* `domainOnly` - 如果设置为`true`,将校验URL是否时主域名和子域名.
* `protocols` - 可被接受的协议数组,默认为`http`,`https`
```javascript
// Examples
url { allowUserPass: true }
url { allowBlank: true, allowIp: true, allowPort: true, protocols: ['http', 'https', 'ftp'] }
url { domainOnly: true }
```
##### Conditional Validators
每个校验器都可以带有一个`if` 或者 一个`unless`.条件判断.
```javascript
// function form
firstName: {
presence: {
if: function(object, validator) {
return true;
}
}
}
// string form
// if 'canValidate' is a function on the object it will be called
// if 'canValidate' is a property object.get('canValidate') will be called
firstName: {
presence: {
unless: 'canValidate'
}
}
```
##### Running Validations
当对象被创建时,校验器将自动运行,以及每个属性改变时,也将自动校验.
`isValid` 状态将被冒泡,并且帮助确定直接父级的校验状态
`isInvalid` 状态同样可以被获取
如果你想强制校验所有,只要在对象上调用`.validate()`方法.
`isValid` 将被设置为`true` 或者`false`.所有校验的运行将返回promise,所以不是调用完`validate`方法,就是马上校验完毕的.
`validate`方法返回一个promise,可以调用`then`方法添加完成后的回调
```javascript
user.validate().then(function() {
user.get('isValid'); // true
user.get('isInvalid'); // false
})
```
##### Inspecting Errors
当一个对象集成`Ember.Validations.Mixin`后,该对象将同时拥有一个`errors`对象,所有校验的错误信息
将被放置在该对象上.
```javascript
App.User = Ember.Object.extend(Ember.Validations.Mixin, {
validations: {
firstName: { presence: true }
}
});
user = App.User.create();
user.validate().then(null, function() {
user.get('isValid'); // false
user.get('errors.firstName'); // ["can't be blank"]
user.set('firstName', 'Brian');
user.validate().then(function() {
user.get('isValid'); // true
user.get('errors.firstName'); // []
})
})
```
##### i18n
国际化I18n默认包含以下的keys
```javascript
Ember.I18n.translations = {
errors:{
inclusion: "is not included in the list",
exclusion: "is reserved",
invalid: "is invalid",
confirmation: "doesn't match {{attribute}}",
accepted: "must be accepted",
empty: "can't be empty",
blank: "can't be blank",
present: "must be blank",
tooLong: "is too long (maximum is {{count}} characters)",
tooShort: "is too short (minimum is {{count}} characters)",
wrongLength: "is the wrong length (should be {{count}} characters)",
notANumber: "is not a number",
notAnInteger: "must be an integer",
greaterThan: "must be greater than {{count}}",
greaterThanOrEqualTo: "must be greater than or equal to {{count}}",
equalTo: "must be equal to {{count}}",
lessThan: "must be less than {{count}}",
lessThanOrEqualTo: "must be less than or equal to {{count}}",
otherThan: "must be other than {{count}}",
odd: "must be odd",
even: "must be even"
}
}
```
@namespace Ember
@class Validations
@extends Ember.Namespace
*/