import {
|
emitter,
|
listeners
|
} from '../mixins'
|
|
const NATIVE_COMPONENT_TYPES = ['u-input', 'u-textarea']
|
|
function getForm (weex) {
|
const modulePlus = weex.requireModule('plus')
|
return {
|
name: 'Form',
|
mixins: [emitter, listeners],
|
data: function data () {
|
return {
|
childrenList: []
|
}
|
},
|
listeners: {
|
'@form-submit': '_onSubmit',
|
'@form-reset': '_onReset',
|
'@form-group-update': '_formGroupUpdateHandler'
|
},
|
methods: {
|
_onSubmit ($event) {
|
const data = this._getNativeFormData() || {}
|
this.childrenList.forEach(function (vm) {
|
if (vm._getFormData && vm._getFormData().key) {
|
data[vm._getFormData().key] = vm._getFormData().value
|
}
|
})
|
this.$trigger('submit', {
|
value: data
|
})
|
},
|
_onReset ($event) {
|
this.$trigger('reset', {})
|
this._getNativeFormData(true)
|
this.childrenList.forEach(function (vm) {
|
vm._resetFormData && vm._resetFormData()
|
})
|
},
|
_formGroupUpdateHandler ($event) {
|
if ($event.type === 'add') {
|
this.childrenList.push($event.vm)
|
}
|
else {
|
const index = this.childrenList.indexOf($event.vm)
|
this.childrenList.splice(index, 1)
|
}
|
},
|
_getNativeFormData (isClear) {
|
const data = {}
|
|
function find (nodes) {
|
nodes.forEach(function (node) {
|
if (NATIVE_COMPONENT_TYPES.indexOf(node.tag) >= 0 && node.data.attrs && node.data.attrs['name']) {
|
if (isClear) {
|
node.elm.setValue('')
|
}
|
else {
|
data[node.data.attrs['name']] = modulePlus.getValue(node.elm.nodeId)
|
}
|
}
|
if (node.children) {
|
find(node.children)
|
}
|
})
|
}
|
|
find(this.$vnode.componentOptions.children)
|
|
return data
|
}
|
},
|
render (createElement) {
|
const _vm = this
|
return createElement('view', _vm._g({}, _vm.$listeners), [_vm._t('default')], 2)
|
}
|
}
|
}
|
|
export default function init (Vue, weex) {
|
Vue.component('form', getForm(weex))
|
}
|