2

defaultsオブジェクトが次のようなバックボーン モデルを持っている場合:

defaults {
  "id" : null
  "name" : null,
  "url" : null,
  "admin" : {
    "id" : null,
    "email" : null
  }
}

のようなものの存在を検証するための推奨される方法はありadmin[id]ますか? 試行を行うメソッドを作成しましたが、(特に新しいモデルの作成時に)null値に対して、またはデータが必要であると予想される値で DB からフェッチされ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

必須属性の括弧表記に固執していない場合は、この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/

于 2013-05-25T11:45:12.343 に答える