radio-group.js 2.4 KB
Newer Older
L
li-ti-ti 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
import {
  emitter,
  listeners
} from '../mixins'

function getRadioGroup (weex) {
  return {
    name: 'RadioGroup',
    mixins: [emitter, listeners],
    props: {
      name: {
        type: String,
        default: ''
      }
    },
    data: function data () {
      return {
        radioList: []
      }
    },
    listeners: {
      '@radio-change': '_changeHandler',
      '@radio-group-update': '_radioGroupUpdateHandler'
    },
    mounted () {
      this._resetRadioGroupValue(this.radioList.length - 1)
    },
    created () {
      this.$dispatch('Form', 'uni-form-group-update', {
        type: 'add',
        vm: this
      })
    },
    beforeDestroy () {
      this.$dispatch('Form', 'uni-form-group-update', {
        type: 'remove',
        vm: this
      })
    },
    methods: {
      _changeHandler ($event, vm) {
        const index = this.radioList.indexOf(vm)
        this._resetRadioGroupValue(index, true)
        this.$trigger('change', {
          value: vm.radioValue
        })
      },
      _radioGroupUpdateHandler ($event) {
        if ($event.type === 'add') {
          this.radioList.push($event.vm)
        }
        else {
          const index = this.radioList.indexOf($event.vm)
          this.radioList.splice(index, 1)
        }
      },
      _resetRadioGroupValue (key, change) {
        const _this = this

        this.radioList.forEach(function (value, index) {
          if (index === key) {
            return
          }
          if (change) {
            _this.radioList[index].radioChecked = false
          }
          else {
            _this.radioList.forEach(function (v, i) {
              if (index >= i) {
                return
              }
              if (_this.radioList[i].radioChecked) {
                _this.radioList[index].radioChecked = false
              }
            })
          }
        })
      },
      _getFormData () {
        const data = {}
        if (this.name !== '') {
          let value = ''
          this.radioList.forEach(function (vm) {
            if (vm.radioChecked) {
              value = vm.value
            }
          })
          data['value'] = value
          data['key'] = this.name
        }
        return data
      }
    },
    render (createElement) {
      const _vm = this
      return createElement('div', _vm._g({}, _vm.$listeners), [_vm._t('default')], 2)
    }
  }
}

export default function init (Vue, weex) {
  Vue.component('radio-group', getRadioGroup(weex))
}