From 37dfc83db30fab283772d29de480cf78c1ea162a Mon Sep 17 00:00:00 2001 From: Leopoldthecoder Date: Mon, 8 Aug 2016 17:27:43 +0800 Subject: [PATCH] fix nestedSchema support --- src/form/fields/field-common.js | 7 +++---- src/schema/index.js | 26 ++++++++++++++++++++++---- src/util.js | 6 ++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/form/fields/field-common.js b/src/form/fields/field-common.js index 1dcd1e3..5ec0768 100644 --- a/src/form/fields/field-common.js +++ b/src/form/fields/field-common.js @@ -143,6 +143,9 @@ export default { onCreated() { if (this.$parent.$isForm) { this.form = this.$parent; + if (this.form && this.form.model) { + this.model = this.form.model; + } } }, @@ -177,10 +180,6 @@ export default { if (!this._props.editorWidth.raw && form.editorWidth) { this.editorWidth = form.editorWidth; } - - if (form && form.model) { - this.model = form.model; - } } if (this.model && this.model.$on) { diff --git a/src/schema/index.js b/src/schema/index.js index 14aaae3..8fb7d7c 100644 --- a/src/schema/index.js +++ b/src/schema/index.js @@ -1,5 +1,5 @@ import { default as validatorFnMap } from './validators'; -import { formatDate, merge, getPath } from '../util'; +import { formatDate, merge, getPath, getNestedPath } from '../util'; import { default as defaultMessages } from './messages'; var doValidate = function(object, property, descriptor, rule) { @@ -14,8 +14,9 @@ var doValidate = function(object, property, descriptor, rule) { } var clonedRule = merge({ message: message || '' }, rule); + let target = getPath(object, property); - if (!validateFn.call(object, object[property], clonedRule, property, descriptor)) { + if (!validateFn.call(object, target, clonedRule, property, descriptor)) { object.$hints[property] = clonedRule.message; return false; @@ -210,6 +211,12 @@ class Schema { } } + for (let nestedSchema in this.nestedSchema) { + if (this.nestedSchema.hasOwnProperty(nestedSchema)) { + result[nestedSchema] = this.nestedSchema[nestedSchema].newModel(); + } + } + initObject(result, this, true); return result; @@ -220,7 +227,13 @@ class Schema { } getPropertyLabel(property) { - return (this.props[property] || {}).label || ''; + let target; + if (property.indexOf('.') > -1) { + target = getNestedPath(this.props, property); + } else { + target = this.props[property]; + } + return (target || {}).label || ''; } getPropertyMapping(property, object, ...args) { @@ -334,7 +347,12 @@ class Schema { initObject(object, this); const props = this.props; - const descriptor = props[property]; + let descriptor; + if (property.indexOf('.') > -1) { + descriptor = getNestedPath(props, property); + } else { + descriptor = props[property]; + } if (!descriptor) { console.warn(`no property ${property} found in object:`, object); // eslint-disable-line no-console diff --git a/src/util.js b/src/util.js index 981f9b4..72d79ad 100644 --- a/src/util.js +++ b/src/util.js @@ -76,6 +76,12 @@ export function throttle(fn, delay) { }; } +export function getNestedPath(object, nestedProp) { + let propertyArr = nestedProp.split('.'); + let property = propertyArr.pop(); + return getPath(object, propertyArr.join('.')).fields[property]; +} + export function getPath(object, prop) { prop = prop || ''; var paths = prop.split('.');