Backbone JS:验证所需的嵌套属性/模型?

时间:2013-05-24 18:47:56

标签: validation backbone.js

如果我有一个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]”之类的东西。任何帮助都是适用的。

1 个答案:

答案 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;
}

演示http://jsfiddle.net/FrtHb/2/