如何在Angular 2中包含外部JavaScript库?

时间:2016-04-22 13:22:49

标签: javascript angular typescript

我正在尝试在我的Angular 2应用程序中包含一个外部JS库,并尝试将该JS文件中的所有方法作为Angular 2应用程序中的服务。

例如:假设我的JS文件包含。

var hello = {
   helloworld : function(){
       console.log('helloworld');
   },
   gmorning : function(){
      console.log('good morning'); 
   }
}

所以我试图使用这个JS文件并重用该对象中的所有方法并将其添加到服务中,以便我的服务具有公共方法,而这些方法又调用这些JS方法。我试图重用代码,而不重新实现我的基于Angular 2应用程序的打字稿中的所有方法。我依赖于外部库,我无法修改。 请帮助,提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用ES6,您可以导出变量:

export var hello = {
  (...)
};

并将其导入另一个模块:

import {hello} from './hello-module';

假设第一个模块位于hello-module.js文件中,并且位于与第二个模块相同的文件夹中。没有必要将它们放在同一个文件夹中(你可以这样做:import {hello} from '../folder/hello-module';)。重要的是SystemJS正确处理了该文件夹(例如,packages块中的配置)。

答案 1 :(得分:1)

当使用外部加载到浏览器中的外部库(例如通过index.html)时,您只需要通过“声明”说明您的服务/组件,然后使用它。例如,我最近在angular2组件中使用了socket.io:

import { Component, Input, Observable, AfterContentInit } from angular2/angular2';
import { Http } from 'angular2/http';

//needed to use socket.io! io is globally known by the browser!
declare var io:any;

@Component({
  selector: 'my-weather-cmp',
  template: `...`
})
export class WeatherComp implements AfterContentInit{
  //the socket.io connection
  public weather:any;
  //the temperature stream as Observable
  public temperature:Observable<number>;

    //@Input() isn't set yet
    constructor(public http: Http) {
      const BASE_URL = 'ws://'+location.hostname+':'+location.port;
      this.weather = io(BASE_URL+'/weather');
      //log any messages from the message event of socket.io
      this.weather.on('message', (data:any) =>{
        console.log(data);
      });
    }

    //@Input() is set now!
    ngAfterContentInit():void {
      //add Observable
      this.temperature = Observable.fromEvent(this.weather, this.city);
    }
}