1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- /* @flow */
- import { looseEqual, looseIndexOf } from 'shared/util'
- // this is only applied for <select v-model> because it is the only edge case
- // that must be done at runtime instead of compile time.
- export default function model (node: VNodeWithData, dir: VNodeDirective) {
- if (!node.children) return
- const value = dir.value
- const isMultiple = node.data.attrs && node.data.attrs.multiple
- for (let i = 0, l = node.children.length; i < l; i++) {
- const option = node.children[i]
- if (option.tag === 'option') {
- if (isMultiple) {
- const selected =
- Array.isArray(value) &&
- (looseIndexOf(value, getValue(option)) > -1)
- if (selected) {
- setSelected(option)
- }
- } else {
- if (looseEqual(value, getValue(option))) {
- setSelected(option)
- return
- }
- }
- }
- }
- }
- function getValue (option) {
- const data = option.data || {}
- return (
- (data.attrs && data.attrs.value) ||
- (data.domProps && data.domProps.value) ||
- (option.children && option.children[0] && option.children[0].text)
- )
- }
- function setSelected (option) {
- const data = option.data || (option.data = {})
- const attrs = data.attrs || (data.attrs = {})
- attrs.selected = ''
- }
|