2016-08-05 4 views
0

In meiner ionic2-Anwendung muss ich Benutzerinformationen so speichern, dass sie auch nach dem Schließen und erneuten Öffnen der App verfügbar sind. Daher verwende ich SqlStorage Service für diesen Zweck.Schreiben von Gettern und Setter in Typescript (Ionic2)

jedoch der Code ziemlich lang ist und hässlich:

import { Injectable } from '@angular/core'; 
import {Storage, SqlStorage} from 'ionic-angular'; 

@Injectable() 
export class Profile { 
    private _storage: any; 

    constructor(private _api: ApiEndpoint, private _uploadService: UploadService) { 
    this._storage = new Storage(SqlStorage); 
    } 

    get firstname(): string { 
    return this._storage.get('firstname'); 
    } 

    set firstname(value: string) { 
    this._storage.set('firstname', value); 
    } 

    get lastname(): string { 
    return this._storage.get('lastname'); 
    } 

    set lastname(value: string) { 
    this._storage.set('lastname', value); 
    } 

    get username(): string { 
    return this._storage.get('username'); 
    } 

    set username(value: string) { 
    this._storage.set('username', value); 
    } 

.... 
.... 
.... and so on for every field 

Meine Frage ist, gibt es einen besseren Weg, um diesen Code zu schreiben?

Antwort

0

Sie können die Getter und Setter zur Laufzeit mit einem Decorator generieren. Soweit es das Typsystem betrifft, sind eine Eigenschaft mit Gettern und Setter und eine gewöhnliche Eigenschaft gleich. Wenn Sie sie zur Laufzeit deklarieren, verletzen sie daher nicht das Typsystem.

Hier ist ein Beispiel in der TypeScript Playground

import { Injectable } from '@angular/core'; 
import {Storage, SqlStorage} from 'ionic-angular'; 

function Storage(target, propName: string) { 
    Object.defineProperty(target, propName, { 
     configurable: true, 
     get: function() { 
      return this._storage.get(propName); 
     }, 
     set: function(v) { 
      return this._storage.set(propName, v); 
     } 
    }); 
} 

@Injectable() 
export class Profile { 
    private _storage: any; 

    constructor(private _api: ApiEndpoint, private _uploadService: UploadService) { 
     this._storage = new Storage(SqlStorage); 
    } 

    @Storage 
    firstname: string; 
    @Storage 
    lastname: string; 
    @Storage 
    username: string; 
} 
Verwandte Themen