/* @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 = ''
|
}
|