2016-10-03 43 views
1

我加载socket.io在我的应用程序,像这样:注入窗口对象到一个组件插入角度与DI

index.html 
<script src="http://myapp.com/socket.io/socket.io.js"></script> 
... 
// Angular stuff 

我有一个名为Socket组件,它需要window.io工作。

import { Injectable } from '@angular/core'; 
import { Events } from 'ionic-angular'; 

@Injectable() 
export class Socket { 

    public isConnected: boolean = false; 

    constructor(public events: Events) { 
    if (typeof window.io === "undefined") { 
     throw new Error("Socket.io is undefined."); 
    } 

    this.io = window.io; 
    } 

    connect() { 
    this.io.connect("..."); 
    } 

    listen() { 

    } 

} 

从理论上讲,它可能工作(没有测试),但它不是以将来自窗口范围的东西为类一个很好的做法。

有没有办法做到这一点是这样的:

import { SocketIODriver } from 'socket.io'; 
import { Socket } from 'App/Socket/Socket'; 

@Component({ 
    templateUrl: 'layout.html' 
}) 
export class ConferenceApp { 
    constructor(
    public io: io, 
    public Socket: Socket 
    ) { 
     this.socket = new Socket(new SocketIODriver()); 
    } 
} 

谢谢。

Ps。 IIRC,socket.io必须从服务器加载,这就是为什么我从我的服务器加载它。如果它可以放在我的JS文件夹中,那会更好。

回答

2

Angular 2可与注射器配合使用。每个注射器都可以用这种方式轻松使用它们。例如,您可以使用名为{useValue:'theValueToInject'}的对象来查看角度为2的注入器API。

这样,当你要注入的东西是已经实例化,或者仅仅是一个值(又名窗口例如对象),你可以将它传递给你的模块的注射器通过useValue:

@NgModule({ 
    declarations: [ 
    ... 
    ], 
    imports: [ 
    ... 
    ], 
    providers: [ 
    { provide: 'Window', useValue: window } 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

所以,你可以使用它:

constructor(@Inject('Window') private window: any) {} // or window type, I don't know what it's exaclty