2016-08-04 72 views
4

在角1.x和離子1.x的我可以通過依賴注入訪問window對象,像這樣:訪問窗口對象離子2 /角2公測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; 
     } 
    }; 
}]); 

我怎麼可以這樣做in Angular 2 & Ionic 2?

+0

使用**窗口**相同,你會在普通的JavaScript? – toskv

+0

或者你可以製作一個包裝窗口對象的服務。所以你可以更容易地在測試中嘲笑它。 – toskv

+0

@toskv你能舉個例子嗎? –

回答

5

可以使用window對象,而無需輸入任何東西,但只是用它在你的打字稿代碼:

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'); 
    } 
} 

你也可以換一個服務裏面window對象,那麼你可以嘲笑它用於測試目的。

一個天真的實現是:

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

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

自舉應用程序時,所以它是隨處可見您可以提供這一點。

import { WindowService } from './windowservice'; 

bootstrap(AppComponent, [WindowService]); 

而只是用它在你的組件。

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'); 
    } 
} 

一個更復雜的服務可以換的方法和要求,以便它更愉快的使用。

+0

感謝編輯@toskv。我會在'WindowService'代碼中添加一個帶有空參數的構造函數,因此在測試中,您可以使用您想要測試的方法發送一個模擬對象。 – sebaferreras

+0

這是一個很好的ideea,隨時可以這樣做! :) – toskv

+0

非常感謝toskv和@sebaferreras。我現在更瞭解它。是否也可以爲localStorage編寫自定義setter/getters? –