|
|
@ -1,6 +1,6 @@ |
|
|
|
/* @flow */ |
|
|
|
|
|
|
|
import { extend } from 'shared/util' |
|
|
|
import { extend, toNumber } from 'shared/util' |
|
|
|
|
|
|
|
function updateDOMProps (oldVnode: VNodeWithData, vnode: VNodeWithData) { |
|
|
|
if (!oldVnode.data.domProps && !vnode.data.domProps) { |
|
|
@ -35,7 +35,10 @@ function updateDOMProps (oldVnode: VNodeWithData, vnode: VNodeWithData) { |
|
|
|
elm._value = cur |
|
|
|
// avoid resetting cursor position when value is the same
|
|
|
|
const strCur = cur == null ? '' : String(cur) |
|
|
|
if (elm.value !== strCur && !elm.composing && document.activeElement !== elm) { |
|
|
|
if (!elm.composing && ( |
|
|
|
(document.activeElement !== elm && elm.value !== strCur) || |
|
|
|
isValueChanged(vnode, strCur) |
|
|
|
)) { |
|
|
|
elm.value = strCur |
|
|
|
} |
|
|
|
} else { |
|
|
@ -44,6 +47,29 @@ function updateDOMProps (oldVnode: VNodeWithData, vnode: VNodeWithData) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function isValueChanged (vnode: VNodeWithData, newVal: string): boolean { |
|
|
|
const value = vnode.elm.value |
|
|
|
const modifiers = getModelModifier(vnode) |
|
|
|
if ((modifiers && modifiers.number) || vnode.elm.type === 'number') { |
|
|
|
return toNumber(value) !== toNumber(newVal) |
|
|
|
} |
|
|
|
if (modifiers && modifiers.trim) { |
|
|
|
return value.trim() !== newVal.trim() |
|
|
|
} |
|
|
|
return value !== newVal |
|
|
|
} |
|
|
|
|
|
|
|
function getModelModifier (vnode: VNodeWithData): ?ASTModifiers { |
|
|
|
const directives = vnode.data.directives |
|
|
|
if (!directives) return |
|
|
|
for (let i = 0, directive; i < directives.length; i++) { |
|
|
|
directive = directives[i] |
|
|
|
if (directive.name === 'model') { |
|
|
|
return directive.modifiers |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
export default { |
|
|
|
create: updateDOMProps, |
|
|
|
update: updateDOMProps |
|
|
|