You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
6.6 KiB
363 lines
6.6 KiB
4 years ago
|
|
||
|
const events = {
|
||
|
load: 'load',
|
||
|
error: 'error'
|
||
|
}
|
||
|
const pageMode = {
|
||
|
add: 'add',
|
||
|
replace: 'replace'
|
||
|
}
|
||
|
|
||
|
const attrs = [
|
||
|
'pageCurrent',
|
||
|
'pageSize',
|
||
|
'collection',
|
||
|
'action',
|
||
|
'field',
|
||
|
'getcount',
|
||
|
'orderby',
|
||
|
'where'
|
||
|
]
|
||
|
|
||
|
export default {
|
||
|
props: {
|
||
|
collection: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
action: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
field: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
pageData: {
|
||
|
type: String,
|
||
|
default: 'add'
|
||
|
},
|
||
|
pageCurrent: {
|
||
|
type: Number,
|
||
|
default: 1
|
||
|
},
|
||
|
pageSize: {
|
||
|
type: Number,
|
||
|
default: 20
|
||
|
},
|
||
|
getcount: {
|
||
|
type: [Boolean, String],
|
||
|
default: false
|
||
|
},
|
||
|
orderby: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
where: {
|
||
|
type: [String, Object],
|
||
|
default: ''
|
||
|
},
|
||
|
getone: {
|
||
|
type: [Boolean, String],
|
||
|
default: false
|
||
|
},
|
||
|
manual: {
|
||
|
type: Boolean,
|
||
|
default: false
|
||
|
}
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
loading: false,
|
||
|
listData: this.getone ? {} : [],
|
||
|
paginationInternal: {
|
||
|
current: this.pageCurrent,
|
||
|
size: this.pageSize,
|
||
|
count: 0
|
||
|
},
|
||
|
errorMessage: ''
|
||
|
}
|
||
|
},
|
||
|
created() {
|
||
|
let db = null;
|
||
|
let dbCmd = null;
|
||
|
|
||
|
if(this.collection){
|
||
|
this.db = uniCloud.database();
|
||
|
this.dbCmd = this.db.command;
|
||
|
}
|
||
|
|
||
|
this._isEnded = false
|
||
|
|
||
|
this.$watch(() => {
|
||
|
var al = []
|
||
|
attrs.forEach(key => {
|
||
|
al.push(this[key])
|
||
|
})
|
||
|
return al
|
||
|
}, (newValue, oldValue) => {
|
||
|
this.paginationInternal.pageSize = this.pageSize
|
||
|
|
||
|
let needReset = false
|
||
|
for (let i = 2; i < newValue.length; i++) {
|
||
|
if (newValue[i] != oldValue[i]) {
|
||
|
needReset = true
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if (needReset) {
|
||
|
this.clear()
|
||
|
this.reset()
|
||
|
}
|
||
|
if (newValue[0] != oldValue[0]) {
|
||
|
this.paginationInternal.current = this.pageCurrent
|
||
|
}
|
||
|
|
||
|
this._execLoadData()
|
||
|
})
|
||
|
|
||
|
// #ifdef H5
|
||
|
if (process.env.NODE_ENV === 'development') {
|
||
|
this._debugDataList = []
|
||
|
if (!window.unidev) {
|
||
|
window.unidev = {
|
||
|
clientDB: {
|
||
|
data: []
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
unidev.clientDB.data.push(this._debugDataList)
|
||
|
}
|
||
|
// #endif
|
||
|
|
||
|
// #ifdef MP-TOUTIAO
|
||
|
let changeName
|
||
|
let events = this.$scope.dataset.eventOpts
|
||
|
for (var i = 0; i < events.length; i++) {
|
||
|
let event = events[i]
|
||
|
if (event[0].includes('^load')) {
|
||
|
changeName = event[1][0][0]
|
||
|
}
|
||
|
}
|
||
|
if (changeName) {
|
||
|
let parent = this.$parent
|
||
|
let maxDepth = 16
|
||
|
this._changeDataFunction = null
|
||
|
while (parent && maxDepth > 0) {
|
||
|
let fun = parent[changeName]
|
||
|
if (fun && typeof fun === 'function') {
|
||
|
this._changeDataFunction = fun
|
||
|
maxDepth = 0
|
||
|
break
|
||
|
}
|
||
|
parent = parent.$parent
|
||
|
maxDepth--;
|
||
|
}
|
||
|
}
|
||
|
// #endif
|
||
|
|
||
|
// if (!this.manual) {
|
||
|
// this.loadData()
|
||
|
// }
|
||
|
},
|
||
|
// #ifdef H5
|
||
|
beforeDestroy() {
|
||
|
if (process.env.NODE_ENV === 'development' && window.unidev) {
|
||
|
var cd = this._debugDataList
|
||
|
var dl = unidev.clientDB.data
|
||
|
for (var i = dl.length - 1; i >= 0; i--) {
|
||
|
if (dl[i] === cd) {
|
||
|
dl.splice(i, 1)
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
// #endif
|
||
|
methods: {
|
||
|
loadData(args1, args2) {
|
||
|
let callback = null
|
||
|
if (typeof args1 === 'object') {
|
||
|
if (args1.clear) {
|
||
|
this.clear()
|
||
|
this.reset()
|
||
|
}
|
||
|
if (args1.current !== undefined) {
|
||
|
this.paginationInternal.current = args1.current
|
||
|
}
|
||
|
if (typeof args2 === 'function') {
|
||
|
callback = args2
|
||
|
}
|
||
|
} else if (typeof args1 === 'function') {
|
||
|
callback = args1
|
||
|
}
|
||
|
|
||
|
this._execLoadData(callback)
|
||
|
},
|
||
|
loadMore() {
|
||
|
if (this._isEnded) {
|
||
|
return
|
||
|
}
|
||
|
this._execLoadData()
|
||
|
},
|
||
|
refresh() {
|
||
|
this.clear()
|
||
|
this._execLoadData()
|
||
|
},
|
||
|
clear() {
|
||
|
this._isEnded = false
|
||
|
this.listData = []
|
||
|
},
|
||
|
reset() {
|
||
|
this.paginationInternal.current = 1
|
||
|
},
|
||
|
remove(id, {
|
||
|
action,
|
||
|
callback,
|
||
|
confirmTitle,
|
||
|
confirmContent
|
||
|
} = {}) {
|
||
|
if (!id || !id.length) {
|
||
|
return
|
||
|
}
|
||
|
uni.showModal({
|
||
|
title: confirmTitle || '提示',
|
||
|
content: confirmContent || '是否删除该数据',
|
||
|
showCancel: true,
|
||
|
success: (res) => {
|
||
|
if (!res.confirm) {
|
||
|
return
|
||
|
}
|
||
|
this._execRemove(id, action, callback)
|
||
|
}
|
||
|
})
|
||
|
},
|
||
|
_execLoadData(callback) {
|
||
|
if (this.loading) {
|
||
|
return
|
||
|
}
|
||
|
this.loading = true
|
||
|
this.errorMessage = ''
|
||
|
|
||
|
this._getExec().then((res) => {
|
||
|
this.loading = false
|
||
|
const {
|
||
|
data,
|
||
|
count
|
||
|
} = res.result
|
||
|
this._isEnded = data.length < this.pageSize
|
||
|
|
||
|
callback && callback(data, this._isEnded)
|
||
|
this._dispatchEvent(events.load, data)
|
||
|
|
||
|
if (this.getone) {
|
||
|
this.listData = data.length ? data[0] : undefined
|
||
|
} else if (this.pageData === pageMode.add) {
|
||
|
this.listData.push(...data)
|
||
|
if (this.listData.length) {
|
||
|
this.paginationInternal.current++
|
||
|
}
|
||
|
} else if (this.pageData === pageMode.replace) {
|
||
|
this.listData = data
|
||
|
this.paginationInternal.count = count
|
||
|
}
|
||
|
|
||
|
// #ifdef H5
|
||
|
if (process.env.NODE_ENV === 'development') {
|
||
|
this._debugDataList.length = 0
|
||
|
this._debugDataList.push(...JSON.parse(JSON.stringify(this.listData)))
|
||
|
}
|
||
|
// #endif
|
||
|
}).catch((err) => {
|
||
|
this.loading = false
|
||
|
this.errorMessage = err
|
||
|
callback && callback()
|
||
|
this.$emit(events.error, err)
|
||
|
})
|
||
|
},
|
||
|
_getExec() {
|
||
|
let exec = this.db
|
||
|
if (this.action) {
|
||
|
exec = exec.action(this.action)
|
||
|
}
|
||
|
|
||
|
exec = exec.collection(this.collection)
|
||
|
|
||
|
if (!(!this.where || !Object.keys(this.where).length)) {
|
||
|
exec = exec.where(this.where)
|
||
|
}
|
||
|
if (this.field) {
|
||
|
exec = exec.field(this.field)
|
||
|
}
|
||
|
if (this.orderby) {
|
||
|
exec = exec.orderBy(this.orderby)
|
||
|
}
|
||
|
|
||
|
const {
|
||
|
current,
|
||
|
size
|
||
|
} = this.paginationInternal
|
||
|
exec = exec.skip(size * (current - 1)).limit(size).get({
|
||
|
getCount: this.getcount
|
||
|
})
|
||
|
|
||
|
return exec
|
||
|
},
|
||
|
_execRemove(id, action, callback) {
|
||
|
if (!this.collection || !id) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
const ids = Array.isArray(id) ? id : [id]
|
||
|
if (!ids.length) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
uni.showLoading({
|
||
|
mask: true
|
||
|
})
|
||
|
|
||
|
let exec = this.db
|
||
|
if (action) {
|
||
|
exec = exec.action(action)
|
||
|
}
|
||
|
|
||
|
exec.collection(this.collection).where({
|
||
|
_id: dbCmd.in(ids)
|
||
|
}).remove().then((res) => {
|
||
|
callback && callback(res.result)
|
||
|
if (this.pageData === pageMode.replace) {
|
||
|
this.refresh()
|
||
|
} else {
|
||
|
this.removeData(ids)
|
||
|
}
|
||
|
}).catch((err) => {
|
||
|
uni.showModal({
|
||
|
content: err.message,
|
||
|
showCancel: false
|
||
|
})
|
||
|
}).finally(() => {
|
||
|
uni.hideLoading()
|
||
|
})
|
||
|
},
|
||
|
removeData(ids) {
|
||
|
let il = ids.slice(0)
|
||
|
let dl = this.listData
|
||
|
for (let i = dl.length - 1; i >= 0; i--) {
|
||
|
let index = il.indexOf(dl[i]._id)
|
||
|
if (index >= 0) {
|
||
|
dl.splice(i, 1)
|
||
|
il.splice(index, 1)
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
_dispatchEvent(type, data) {
|
||
|
if (this._changeDataFunction) {
|
||
|
this._changeDataFunction(data, this._isEnded)
|
||
|
} else {
|
||
|
this.$emit(type, data, this._isEnded)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|