1

プロジェクトでAjvを使用しています。ajv.addKeywordAPIを使用してカスタム キーワードを追加しようとしています。これを行うことでキーワードを追加できます(ドキュメントから借用):

var ajv = new Ajv({
  $data: true
});

ajv.addKeyword('range', {
  type: 'number',
  compile: function(sch, parentSchema) {
    var min = sch[0];
    var max = sch[1];
    return parentSchema.exclusiveRange === true ? function(data) {
      return data > min && data < max;
    } : function(data, dataPath, parentData, parentDataProperty) {
      return data >= min && data <= max;
    }
  }
});

var schema = {
  "properties": {
    "smaller": {
      "type": "number"
    },
    "larger": {
      "type": "number",
      "range": [2, 10]
    }
  }
};

var validData = {
  smaller: 15,
  larger: 17
};

let validateData = ajv.compile(schema);
validateData(validData);
console.log('Errors after validations --> ', validateData.errors)

すべてが正常に機能しています。ここ$dataで、カスタム フィールドの原因データを使用する必要があり、他のフィールドの値になります。それを達成するために、これは私が自分のスキーマで試したことです:

var schema = {
  "properties": {
    "smaller": {
      "type": "number"
    },
    "larger": {
      "type": "number",
      // "range": [2, 10],
      "range": {
        "$data": "1/myRange" // referencing to myRange
      }
    },
    "myRange": {
      type: "array",
      items: {
        type: "number"
      }
    }
  }
};

しかし、カスタム フィールドは$dataまだ ref でサポートされていないようです。ドキュメントに記載されているように、$data ref では次のフィールドのみがサポートされています。

$data 参照はキーワードでサポートされています: const、enum、format、maximum/minimum、exclusiveMaximum / ExclusiveMinimum、maxLength / minLength、maxItems / minItems、maxProperties / minProperties、formatMaximum / formatMinimum、formatExclusiveMaximum / formatExclusiveMinimum、multipleOf、pattern、required、uniqueItems .

値を取得する 1 つの方法は、validate 関数のパラメーターを使用し、data, dataPath, parentData, parentDataPropertyロジックを記述して、$dataref で定義されたフィールドの値を抽出することです。しかし、これがそれを達成するための正しい方法であるかどうかはわかりません。誰でもこれについて私を助けてもらえますか? これが再生するplunkrです。ありがとう。

4

1 に答える 1