@caxa-form/core
Version:
vue动态表单,助你轻松搞定表单|form-create is a form generation component that can generate dynamic rendering, data collection, verification and submission functions through JSON. Supports 3 UI frameworks, and supports the generation of any Vue components. Built-in 20
81 lines (74 loc) • 2.95 kB
JavaScript
import extend from '@caxa-form/utils/lib/extend';
import is from '@caxa-form/utils/lib/type';
import toLine from '@caxa-form/utils/lib/toline';
export default function useInject(Handler) {
extend(Handler.prototype, {
parseInjectEvent(rule, on) {
if (rule.inject === false) return;
const inject = rule.inject || this.options.injectEvent;
if (is.Undef(inject)) return;
Object.keys(on).forEach(k => {
if (is.Function(on[k]))
on[k] = this.inject(rule, on[k], inject)
});
return on;
},
parseEmit(ctx, on) {
let event = {}, rule = ctx.rule, {emitPrefix, field, name, inject} = rule;
let emit = rule[on ? 'emit' : 'nativeEmit'] || [];
if (is.trueArray(emit)) {
let emitKey = emitPrefix || field || name;
if (emitKey) {
if (!on) emitKey = `native-${emitKey}`;
emit.forEach(eventName => {
if (!eventName) return;
let eventInject;
if (is.Object(eventName)) {
eventInject = eventName.inject;
eventName = eventName.name;
}
const fieldKey = toLine(`${emitKey}-${eventName}`);
const fn = (...arg) => {
this.vm.$emit(fieldKey, ...arg);
this.vm.$emit('emit-event', fieldKey, ...arg);
};
fn.__emit = true;
if (!eventInject && inject === false) {
event[eventName] = fn;
} else {
let _inject = eventInject || inject || this.options.injectEvent;
event[eventName] = is.Undef(_inject) ? fn : this.inject(rule, fn, _inject);
}
});
}
}
ctx.computed[on ? 'on' : 'nativeOn'] = event;
return event;
},
getInjectData(self, inject) {
const {option, rule} = this.vm.$options.propsData;
return {
$f: this.api,
rule,
self: self.__origin__,
option,
inject
};
},
inject(self, _fn, inject) {
if (_fn.__inject) {
if (this.watching && !this.loading)
return _fn;
_fn = _fn.__origin;
}
const h = this;
const fn = function (...args) {
args.unshift(h.getInjectData(self, inject));
return _fn.apply(this, args);
};
fn.__inject = true;
fn.__origin = _fn;
return fn;
},
})
}