Ich versuche, TypeScript Decorators zum Speichern von Daten im lokalen Speicher in einer Angular-App zu implementieren. Das ist, was ich versucheTypeScript Decorators - Setter nicht aufgerufen Eigenschaft eines Objekts
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
});
};
}
zu erreichen, und es verwenden möchte: Komponente 1:
....
@Cache() userSession: any = {val:''};
ngOnInit() {
this.userSession.val = "some val"
}
....
Komponente 2:
....
@Cache() userSession: any;
ngOnInit() {
console.log('Stored value is',this.userSession);
// expected : {val:'some val'}
// prints : {val:''}
}
....
Also von dem, was ich verstehe, das Eigentum Setter wird nur aufgerufen, wenn es eine Zuweisung zum Objekt selbst gibt und nicht seine Eigenschaft. Daher funktioniert das,
Object.assign(this.userSession , {val: 'some val'});
or
this.userSession = {val: 'some val'}
console.log(this.userSession) // prints: {val: 'some val'}
Aber das wird irgendwie den Zweck schlagen, den ich hier erreichen will. Die Frage ist also, wie kann ich die Decorator-Funktion ändern, um dies zu können?
this.userSession.val = 'some val';
Alle Zeiger geschätzt.
Das ist nicht das Problem. Die vorhandene Eigenschaft muss nicht gelöscht werden, wenn sie vorhanden ist. In diesem Fall ist es nicht einmal vorhanden. Das Problem besteht darin, dass der Zugriff verschachtelt ist. –