12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import {toValue, ref, watch, computed} from 'vue'
- import _ from "lodash";
- import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
- import {useConditionFactory} from "@/components/mx-condition/useConditionFactory";
- export const useConditionDataManager = function (configs, eventManager, queryParams, sharedData, console) {
- const container = ref(new Map())
- const rules = ref({})
- watch(queryParams, async () => {
- console.log('dataManager begin init', new Date().getTime())
- const keys = Object.keys(queryParams.value)
- if (!keys.length) return
- const keysConfig = configs.map(c => c.key)
- const missingKeys = _.difference(keys, keysConfig)
- if (missingKeys.length) console.warn('missing keys: ' + missingKeys.toString())
- // 没有被依赖的属性需要在改变时触发查询
- // 依赖是在config中指定的,但是否没有被依赖需要遍历所有条件才能知道
- const keysNotBeDependent = [...keys]
- keys.forEach(key => {
- const config = configs.find(c => c.key == key)
- if (!config) return _.pull(keysNotBeDependent, key)
- _.pull(keysNotBeDependent, ...config.dependentKeys)
- const condition = useConditionFactory(config, eventManager, queryParams, sharedData, console)
- container.value.set(key, condition)
- // useConditionFactory可能会对规则进行加工
- if (!empty(config.rule)) rules.value[config.key] = config.rule
- // 必须条件立马加入workingList,防止事件过早触发
- if (condition.config.required) eventManager.push('dataManager init of required', key)
- })
- // 一般来说必须得有1个非被依赖项,才能构成一个响应链,否则没有机会触发onSearch
- // TODO:这里只是当1个警告,实际运行效果还待评估
- if (!keysNotBeDependent.length) console.warn('At least one key must not be dependent!')
- keysNotBeDependent.forEach(k => {
- watch(() => toValue(queryParams)[k], () => eventManager.trigger('dataManager watch not be dependent of ' + k))
- })
- }, {immediate: true})
- const conditions = computed(() => [...container.value.values()])
- const filterConditions = computed(() => conditions.value.filter(c => !c.config.hidden))
- const needValidation = computed(() => !empty(rules.value))
- const reset = function () {
- container.value.clear()
- rules.value = {}
- }
- return {
- container,
- conditions: filterConditions,
- rules,
- needValidation,
- reset
- }
- }
|