プロジェクトでAjvを使用しています。ajv.addKeyword
APIを使用してカスタム キーワードを追加しようとしています。これを行うことでキーワードを追加できます(ドキュメントから借用):
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
ロジックを記述して、$data
ref で定義されたフィールドの値を抽出することです。しかし、これがそれを達成するための正しい方法であるかどうかはわかりません。誰でもこれについて私を助けてもらえますか? これが再生するplunkrです。ありがとう。