2016-08-04 25 views
4

In Angular 1.x und Ionic 1.x kann ich das Fenster Objekt durch Dependency Injection zugreifen, etwa so:Zugriff auf Fensterobjekt in Ionic 2/Schräg 2 Beta 10

angular.module('app.utils', []) 

.factory('LocalStorage', ['$window', function($window) { 
    return { 
     set: function(key, value) { 
      $window.localStorage[key] = value; 
     }, 
     get: function(key, defaultValue) { 
      return $window.localStorage[key] || defaultValue; 
     } 
    }; 
}]); 

Wie kann ich das gleiche tun in Angular 2 & Ionen 2?

+0

mit ** Fenster ** wie in normalen Javascript? – toskv

+0

alternativ könnten Sie einen Service machen, der das Fensterobjekt umschließt. So können Sie es leichter in Tests verspotten. – toskv

+0

@toskv Können Sie mir bitte ein Beispiel geben? –

Antwort

5

Sie können das window Objekt, ohne etwas zu importieren, aber nur um es in Ihrem Typoskript Code verwendet:

import { Component } from "@angular/core"; 

@Component({ 
    templateUrl:"home.html" 
}) 
export class HomePage { 

    public foo: string; 

    constructor() { 
    window.localStorage.setItem('foo', 'bar'); 

    this.foo = window.localStorage.getItem('foo'); 
    } 
} 

Sie könnten auch die window Objekt innerhalb eines Service wickeln so ist, dann können Sie es zu Testzwecken verspotten .

wäre eine naive Implementierung sein:

import { Injectable } from '@angular/core'; 

@Injectable() 
export class WindowService { 
    public window = window; 
} 

Sie können dies dann liefern, wenn die Anwendung Bootstrapping so ist es überall verfügbar ist.

import { WindowService } from './windowservice'; 

bootstrap(AppComponent, [WindowService]); 

Und es nur in Ihren Komponenten verwenden.

import { Component } from "@angular/core"; 
import { WindowService } from "./windowservice"; 

@Component({ 
    templateUrl:"home.html" 
}) 
export class HomePage { 

    public foo: string; 

    constructor(private windowService: WindowService) { 
    windowService.window.localStorage.setItem('foo', 'bar'); 

    this.foo = windowService.window.localStorage.getItem('foo'); 
    } 
} 

Eine anspruchsvollere Service könnte die Methoden wickeln und ruft so es angenehmer zu bedienen ist.

+0

Danke für die Bearbeitung @toskv. Ich würde einen Konstruktor im 'WindowService'-Code mit einem Nullwert-Parameter hinzufügen, sodass Sie in den Tests ein Mock-Objekt mit den Methoden senden können, die Sie testen möchten. – sebaferreras

+0

das ist eine gute ideea, zögern sie nicht! :) – toskv

+0

Vielen Dank toskv und @sebaferreras. Ich verstehe es jetzt besser. Ist es auch möglich, benutzerdefinierte Setter/Getter für localStorage zu schreiben? –