javascript 主干验证不起作用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14426155/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Backbone Validate does not work
提问by user1990553
I am using Backbone's validate
function to guarantee Man
to have an age
property more than 18. Here is my code:
我使用的骨干validate
作用,以保证Man
有一个age
财产超过18.这是我的代码:
var Man = Backbone.Model.extend({
initialize : function(){
this.on("error",function(model,error){
alert(error);
});
},
validate : function(attrs,options){
if (attrs.age < 18){
return 'below 18';
}
}
})
var man = new Man({name : 'qian', age : 12});
But looking at the result it seems that validate
doesn't work.
但看结果似乎validate
行不通。
回答by Tom
In Backbone.js (prior to version 0.9.10
), validate
is called before save
as well as before set
.
在 Backbone.js(在 version 之前0.9.10
)中,validate
在 beforesave
和 before 中被调用set
。
You will get an alerterror when you set invalidvalue.
当您设置无效值时,您将收到警报错误。
Example - age
value is below 18:
示例 -age
值低于 18:
var man = new Man ({name : 'qian', age : 12});
man.set({ age: 12 }); // that will trigger alert
EDIT
编辑
For Backbone.js version 0.9.10+
there is an issue reported: Failed validation does not trigger error callback. Issue explanation says that
对于 Backbone.js 版本0.9.10+
,报告了一个问题:失败的验证不会触发错误回调。问题解释说
invalid
event should be used instead oferror
invalid
应该使用事件而不是error
So changing your code to:
因此,将您的代码更改为:
var Man = Backbone.Model.extend({
initialize : function(){
this.on("invalid",function(model,error){
alert(error);
});
},
...
And setting variable with validate
option set to true
will trigger an alert
.
并且将validate
选项设置为设置变量true
将触发alert
.
man.set({age: 12}, {validate : true});
回答by yesnik
For backbone v.1.0.0
对于主干 v.1.0.0
var Man = Backbone.Model.extend({
initialize : function(){
this.on("invalid",function(model,error){
alert(error);
});
},
validate : function(attrs, options){
if (attrs.age < 18){
return 'below 18';
}
}
});
Example 1. Without {validate:true}
示例 1. 没有 {validate:true}
//Object will be created with invalid attribute 'age'
var man = new Man({name : 'qian', age : 12});
console.log(man) // Returns an object with invalid attributes
// But we'll use only valid objects.
// Also we'll get the error message in alert, if validation fails.
if(man.isValid()){
alert( man.get('name') );
}
var man = new Man({name : 'qian', age : 19});
if(man.isValid()){
alert( man.get('name') );
}
Example 2. With {validate:true}
示例 2. 使用 {validate:true}
//Object will be created without any passed attributes
var man = new Man({name : 'qian', age : 12}, {validate:true});
console.log(man) //Object will be without passed attributes
/* man.isValid() returns 'true' throw we passed invalid attrs.
We won't see any error alert message, because Backbone created empty object */
/* Doesn't work */
if(man.isValid()){
alert( man.get('name') ); //undefined
}
/* Works */
// Created model had invalid attrs, so validationError won't be empty.
// If all attrs are valid, validationError will be empty
if(!man.validationError){
alert( man.get('name') );
}
回答by Akshay
If you are using new version(>1.0) of Backbone and want to fire validation at the time of model.set
method,
如果您使用的是新版本 (>1.0) 的 Backbone 并且想在model.set
方法时触发验证,
then you must have to pass {validate: true}
to fire validation.
那么你必须通过{validate: true}
火验证。
use
利用
model.set({field:value},{validate: true})
OR
或者
model.set("field","value",{validate: true})
instead of
代替
model.set({field:value})
REF : Backbone change log
REF:主干更改日志
回答by Vitalii Petrychuk
var man = new Man({name : 'qian', age : 12}, {validate : true});
EDIT:
编辑:
validate method works only in case if you pass an options object with validate
param (from 0.9.9 version):
https://github.com/documentcloud/backbone/blob/master/backbone.js#L539
validate 方法仅在您传递带有validate
参数的选项对象(从 0.9.9 版本开始)的情况下才有效:https:
//github.com/documentcloud/backbone/blob/master/backbone.js#L539
And it triggers not error
event but invalid
event
它触发的不是error
事件而是invalid
事件