2

如果我有一个defaults对象看起来像这样的 Backbone 模型:

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]”之类的东西。任何帮助表示赞赏。

4

1 回答 1

1

如果您对所需属性的括号符号没有死心,您可以从这个问答中获得一些灵感来简化您的验证。

让我们为 _ 添加一个辅助方法来提取给定属性的值:

_.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/

于 2013-05-25T11:45:12.343 回答