如果我有一个Backbone模型,defaults
对象看起来像这样:
defaults {
"id" : null
"name" : null,
"url" : null,
"admin" : {
"id" : null,
"email" : null
}
}
是否有建议的方法来验证admin[id]
之类的内容?我们编写了一个方法来进行尝试,但它一直在null
值上呕吐(特别是在创建新模型上),或者是否从我们的数据库中获取数据,其中null
值是预期的必需(我们将此应用程序放在现有数据之上)。
以下是我们验证必填字段是否存在的方法:
validatePresence = function(requiredAttrs, submittedAttrs, errorsArr) {
var regex = new RegExp(/[a-zA-Z0-9_]+|(?=\[\])/g),
attrStack = null,
val = null,
name = null;
for( var l = requiredAttrs.length; --l >= 0; ) {
attrStack = requiredAttrs[l].match(regex);
val = submittedAttrs[attrStack.shift()];
while(attrStack.length > 0) {
console.log(requiredAttrs[l]);
val = val[attrStack.shift()];
}
if( val === undefined ) { continue; }
name = requiredAttrs[l];
if( val === null || !val.length) {
if( !errorsArr[name] ) {
errorsArr[name] = [];
}
errorsArr[name].push("Oops, this can't be empty");
}
}
return errorsArr;
}
以下是我们在BB模型中调用它的方式:
validate: function(attrs) {
var requiredAttributes = ["name","admin[id]"],
errors = {};
errors = validatePresence(requiredAttributes, attrs, errors);
}
这种方法喜欢窒息“admin [id]”之类的东西。任何帮助都是适用的。
答案 0 :(得分:1)
如果您没有设置所需属性的括号表示法,则可以从此Q&A中汲取灵感,以简化验证。
让我们为_添加一个辅助方法来提取给定属性的值:
_.findprop = function(obj, path) {
var args = path.split('.'), i, l=args.length;
for (i=0; i<l; i++) {
if (!obj.hasOwnProperty(args[i]))
return;
obj = obj[args[i]];
}
return obj;
}
然后可以将您的validate
方法重写为:
validate: function(attrs) {
var requiredAttributes = ["name","admin.id"],
errors = {}, i, l, v, attr;
for (i=0, l=requiredAttributes.length; i<l; i++) {
attr = requiredAttributes[i];
v = _.findprop(attrs, attr);
//checks if the value is truthy, to be adapted to your needs
if (v) continue;
errors[attr] = errors[attr] || [];
errors[attr].push("Oops, this can't be empty");
}
return errors;
}