import {
|
VD_SYNC,
|
UI_EVENT
|
} from '../../../constants'
|
|
import {
|
generateId
|
} from '../../../helpers/util'
|
|
function findParent (vm) {
|
let parent = vm.$parent
|
while (parent) {
|
if (parent._$id) {
|
return parent
|
}
|
parent = parent.$parent
|
}
|
}
|
|
export class VDomSync {
|
constructor (pageId, options = {}) {
|
this.pageId = pageId
|
this.addBatchVData = Object.create(null)
|
this.updateBatchVData = []
|
this.vms = Object.create(null)
|
|
this.version = options.version
|
}
|
|
addVData (cid, data = {}, options = {}) {
|
this.addBatchVData[cid] = [data, options]
|
}
|
|
updateVData (cid, data = {}) {
|
this.updateBatchVData.push([cid, data])
|
}
|
|
addVm (vm) {
|
const id = vm._$id
|
const oldVm = this.vms[id]
|
if (oldVm) {
|
const newId = generateId(oldVm, findParent(oldVm), this.version)
|
oldVm._$id = newId
|
this.vms[newId] = oldVm
|
}
|
this.vms[id] = vm
|
}
|
|
initVm (vm) {
|
vm._$id = generateId(vm, findParent(vm), this.version)
|
let vData = this.addBatchVData[vm._$id]
|
if (!vData) {
|
// console.error('cid unmatched', vm)
|
vData = [{}, {}]
|
} else {
|
delete this.addBatchVData[vm._$id]
|
}
|
const [data, options] = vData
|
Object.assign(vm.$options, options)
|
vm.$r = data || Object.create(null)
|
this.addVm(vm)
|
}
|
|
sendUIEvent (cid, nid, event) {
|
UniViewJSBridge.publishHandler(VD_SYNC, {
|
data: [
|
[UI_EVENT, [
|
[cid, nid, event]
|
]]
|
],
|
options: {
|
timestamp: Date.now()
|
}
|
})
|
}
|
|
clearAddBatchVData () {
|
if (process.env.NODE_ENV !== 'production') {
|
if (Object.keys(this.addBatchVData).length) {
|
console.error('this.addBatchVData...=' + JSON.stringify(this.addBatchVData))
|
}
|
}
|
this.addBatchVData = Object.create(null)
|
}
|
|
flush () {
|
this.updateBatchVData.forEach(([cid, data]) => {
|
const vm = this.vms[cid]
|
if (!vm) {
|
return console.error(`Not found ${cid}`)
|
}
|
Object.keys(data).forEach(cid => {
|
Object.assign((vm.$r[cid] || (vm.$r[cid] = Object.create(null))), data[cid])
|
})
|
|
vm.$forceUpdate()
|
})
|
this.updateBatchVData.length = 0
|
}
|
}
|