33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
|
import { EventManager } from './EventManager'
|
||
|
|
||
|
// 装饰器工厂函数
|
||
|
export function Ob(eventName?: string) {
|
||
|
return function (target: any, propertyKey: string) {
|
||
|
// 存储原始值的弱映射
|
||
|
const privateMap = new WeakMap()
|
||
|
|
||
|
// 定义getter/setter
|
||
|
Object.defineProperty(target, propertyKey, {
|
||
|
get: function () {
|
||
|
return privateMap.get(this)?.value
|
||
|
},
|
||
|
set: function (newValue) {
|
||
|
const oldValue = privateMap.get(this)?.value
|
||
|
if (oldValue == newValue) return
|
||
|
privateMap.set(this, { value: newValue })
|
||
|
// 触发事件
|
||
|
const eventMgr = EventManager.Instance()
|
||
|
const finalEventName = eventName || `${target.constructor.name.toLowerCase()}:${propertyKey}`
|
||
|
const data = { property: propertyKey, oldValue, newValue }
|
||
|
eventMgr.Emit(finalEventName, data)
|
||
|
// 触发通用事件
|
||
|
const commEventName = `${target.constructor.name.toLowerCase()}:property`
|
||
|
const commData = { property: propertyKey, oldValue, newValue }
|
||
|
eventMgr.Emit(commEventName, commData)
|
||
|
},
|
||
|
enumerable: true,
|
||
|
configurable: true,
|
||
|
})
|
||
|
}
|
||
|
}
|