2017-11-18 1 views
1

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.

Antwort

0

Ich bin nicht Dekorateure auf diese Weise, aber ich bin mir ziemlich sicher, dass Sie benötigen die Eigenschaft löschen, um sie zu ersetzen, so ändern Sie dies:

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

Um dies (mit einer Lösch Einwickeln):

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

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. –

Verwandte Themen