forked from nickforddev/vue-models
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmixin.js
64 lines (60 loc) · 1.31 KB
/
mixin.js
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
import { path } from 'ramda'
import { isDef } from './utils'
const makeComputedProp = (vm, key) => {
if (vm.$options[`$${key}`]) {
throw new ReferenceError(
`Model '${key}' has a naming conflict
with an existing computed property'`
)
}
vm.$options.computed[`$${key}`] = {
get() {
return vm.$models[key]
},
set(data) {
return vm.$models[key].set(data)
}
}
}
const init = (vm) => {
vm._models = vm.$options.models || {}
vm.$models = vm.$options.$models || {}
for (let key in vm._models) {
vm.$models[key] = vm._models[key]
}
if (isDef(vm.$models)) {
if (!vm.$options.computed) {
vm.$options.computed = {}
}
for (let key in vm.$models) {
makeComputedProp(vm, key)
}
}
}
const init_models = (vm) => {
for (let key in vm.$models) {
vm.$models[key] = vm.$models[key].apply(vm)
vm.$models[key]._vm = vm
}
}
export default (Vue) => ({
beforeCreate() {
if (isDef(this.$options.models)) {
init(this)
}
},
created() {
if (isDef(this.$options.models)) {
init_models(this)
}
},
beforeDestroy() {
if (isDef(this.$models)) {
for (let key in this.$models) {
if (!path(['$options', 'persist'], this.$models[key])) {
this.$models[key].reset()
}
}
}
}
})