|
@@ -1,13 +1,18 @@
|
|
|
/* @flow */
|
|
/* @flow */
|
|
|
|
|
|
|
|
-import { addHandler, addAttr, parseModel } from 'compiler/helpers'
|
|
|
|
|
|
|
+import { addHandler, addAttr } from 'compiler/helpers'
|
|
|
|
|
+import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
|
|
|
|
|
|
|
|
export default function model (
|
|
export default function model (
|
|
|
el: ASTElement,
|
|
el: ASTElement,
|
|
|
dir: ASTDirective,
|
|
dir: ASTDirective,
|
|
|
_warn: Function
|
|
_warn: Function
|
|
|
): ?boolean {
|
|
): ?boolean {
|
|
|
- genDefaultModel(el, dir.value, dir.modifiers)
|
|
|
|
|
|
|
+ if (el.tag === 'input' || el.tag === 'textarea') {
|
|
|
|
|
+ genDefaultModel(el, dir.value, dir.modifiers)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ genComponentModel(el, dir.value, dir.modifiers)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function genDefaultModel (
|
|
function genDefaultModel (
|
|
@@ -15,25 +20,15 @@ function genDefaultModel (
|
|
|
value: string,
|
|
value: string,
|
|
|
modifiers: ?ASTModifiers
|
|
modifiers: ?ASTModifiers
|
|
|
): ?boolean {
|
|
): ?boolean {
|
|
|
- const { lazy, trim } = modifiers || {}
|
|
|
|
|
|
|
+ const { lazy, trim, number } = modifiers || {}
|
|
|
const event = lazy ? 'change' : 'input'
|
|
const event = lazy ? 'change' : 'input'
|
|
|
- const isNative = el.tag === 'input' || el.tag === 'textarea'
|
|
|
|
|
- const valueExpression = isNative
|
|
|
|
|
- ? `$event.target.attr.value${trim ? '.trim()' : ''}`
|
|
|
|
|
- : `$event`
|
|
|
|
|
|
|
+
|
|
|
|
|
+ let valueExpression = `$event.target.attr.value${trim ? '.trim()' : ''}`
|
|
|
|
|
+ if (number) {
|
|
|
|
|
+ valueExpression = `_n(${valueExpression})`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const code = genAssignmentCode(value, valueExpression)
|
|
const code = genAssignmentCode(value, valueExpression)
|
|
|
addAttr(el, 'value', `(${value})`)
|
|
addAttr(el, 'value', `(${value})`)
|
|
|
addHandler(el, event, code, null, true)
|
|
addHandler(el, event, code, null, true)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-function genAssignmentCode (value: string, assignment: string): string {
|
|
|
|
|
- const modelRs = parseModel(value)
|
|
|
|
|
- if (modelRs.idx === null) {
|
|
|
|
|
- return `${value}=${assignment}`
|
|
|
|
|
- } else {
|
|
|
|
|
- return `var $$exp = ${modelRs.exp}, $$idx = ${modelRs.idx};` +
|
|
|
|
|
- `if (!Array.isArray($$exp)){` +
|
|
|
|
|
- `${value}=${assignment}}` +
|
|
|
|
|
- `else{$$exp.splice($$idx, 1, ${assignment})}`
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|