gpt4 book ai didi

angular - TypeScript 装饰器 - 不在对象的属性上调用 Setter

转载 作者:搜寻专家 更新时间:2023-10-30 21:59:18 25 4
gpt4 key购买 nike

我正在尝试实现 TypeScript 装饰器以将数据存储在 Angular 应用程序的本地存储中。这就是我想要实现的目标

export function Cache() {

return function (target, key): any {
// property value
let _val = target[key];

// property getter
const getter = function () {
const data = localStorage.get(key);
if (data) {
return data;
}
localStorage.set(key, _val);
return _val;
};

// property setter
const setter = function (newVal) {
localStorage.set(key, newVal);
console.log('Setting',newVal);
_val = newVal;
};

// Create new property with getter and setter
Object.defineProperty(target, key, {
configurable: true,
enumerable: true,
get: getter,
set: setter
});
};
}

并像这样使用它:组件 1:

....
@Cache() userSession: any = {val:''};

ngOnInit() {
this.userSession.val = "some val"
}
....

组件 2:

....
@Cache() userSession: any;

ngOnInit() {
console.log('Stored value is',this.userSession);
// expected : {val:'some val'}
// prints : {val:''}
}
....

因此据我了解,仅当对对象本身而非其属性进行任何赋值时,才会调用属性 setter 。因此这是有效的,

Object.assign(this.userSession , {val: 'some val'});
or
this.userSession = {val: 'some val'}

console.log(this.userSession) // prints: {val: 'some val'}

但这有点违背了我在这里要达到的目的。所以问题是,如何修 retrofit 饰器函数才能做到这一点?

this.userSession.val = 'some val';

感谢任何指点。

最佳答案

我没有以这种方式使用装饰器,但我很确定您需要删除该属性才能替换它,因此请更改:

    Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});

为此(用删除包装):

if (delete this[key]) {
Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}

关于angular - TypeScript 装饰器 - 不在对象的属性上调用 Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47367909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com