【问题标题】:Add third party JavaScript file to Angular 4将第三方 JavaScript 文件添加到 Angular 4
【发布时间】:2018-03-21 23:19:30
【问题描述】:

我目前正在尝试将自己读入 Angular 4。对于一个项目,我需要在 Angular 应用程序中使用“HERE Maps”显示地图。 但是我不知道如何在导入脚本的同时保持对组件中类的访问。

我正在尝试按照此处的说明进行操作: https://developer.here.com/documentation/maps/topics/quick-start.html

我尝试将 .js 脚本添加到 index.html,如下所示:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>See720</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">

  <script src="http://js.api.here.com/v3/3.0/mapsjs-core.js" type="text/javascript" charset="utf-8"></script>
  <script src="http://js.api.here.com/v3/3.0/mapsjs-service.js" type="text/javascript" charset="utf-8"></script>
  <script type="text/javascript">
    var platform = new H.service.Platform({
      'app_id': '****',
      'app_code': '****',
      useCIT: true
    });
  </script>
</head>
<body>
  <app-root></app-root>
</body>
</html>

我试图以某种方式将 .js 文件注入到组件或服务中,以便使用 .js 文件中包含的类。但我无法让它工作。

我希望把这部分:

var platform = new H.service.Platform({
    'app_id': '****',
    'app_code': '****',
    useCIT: true
});

... 以某种方式进入 OnInit() 方法。但是“H”对象永远不会被识别。使用平面旧 JavaScript 和 Html 我可以让它工作。

在 Angular 4 中导入此类 JavaScript 文件的正确方法是什么?如何访问其类和方法?

更新

我的代码目前如下所示: 模板:

<div style="text-align:center">
  <!--<div><font color="white">This is some text!</font></div>-->
  <div id="mapContainer" style="width: 900px; height: 600px"></div>
</div>

组件:

import {AfterViewInit, Component} from '@angular/core';

declare var H: any;

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
  title = 'C720';

  ngAfterViewInit() {
    // Initialize the platform object:
    let platform = new H.service.Platform({
      'app_id': '****',
      'app_code': '****',
      useCIT: true
    });

    // Obtain the default map types from the platform object
    let defaultLayers = platform.createDefaultLayers();

    // Instantiate (and display) a map object:
    let map = new H.Map(
      document.getElementById('mapContainer'),
      defaultLayers.normal.map,
      {
        zoom: 5,
        center: { lat: 52.5, lng: 13.5 }
      }
    );
  }
}

index.html:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>See720</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">

  <script src="http://js.api.here.com/v3/3.0/mapsjs-core.js" type="text/javascript" charset="utf-8"></script>
  <script src="http://js.api.here.com/v3/3.0/mapsjs-service.js" type="text/javascript" charset="utf-8"></script>
  <script src="http://js.api.here.com/v3/3.0/mapsjs-mapevents.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
  <app-root></app-root>
</body>
</html>

地图正在显示,但现在我需要添加一个事件监听器,但无法识别第三个包(“mapjs-mapevents.js”)中的 H.mapevent 类。

我如何告诉 Angular 在第三个脚本中查找其他类?

【问题讨论】:

标签: javascript angular dependency-injection


【解决方案1】:

导入 js 文件最简单的方法是将其添加到 Angular cli 项目中(将其添加到 .angular-cli-package.json 中的脚本中),然后简单地: 1 - 将它添加到您的主应用程序模块中,作为 root(),使用正确的用户 + 键 2 - “从组件中的'heremaps'导入HereMap不仅'declare var H:any;”因为它没有指示 lib 路径。在某些情况下,您可以同时执行这两种操作,但对于 angular 4,我使用 import。

https://www.npmjs.com/package/angular-heremaps

【讨论】:

  • 感谢您的回答。我如何实现第 1 步?你能给我举个例子吗?我对 Angular 还很陌生,似乎并不了解所有核心概念。
  • 您提供的链接指向 angularjs 的 npm 包。据我所知,它不可能使用 Angular 2/4 的 angularjs 代码。
  • 当然可以,js或者angularjs包都可以,如果你想和typescript一起使用,那么你可以得到types。要实现第 1 步,首先要获得符合您需求的软件包。
  • 对不起,我一直按回车,所以这里是完整的答案: - 如果你在一个 angular cli 项目中,请将你的 css 和 js 添加到 .angular-cli 中的应用程序中:[ 脚本:[heremap .js, ...] 和样式:[heremaps.css, ...] 如果没有,请将其添加到您的主 index.html 文件中 - 如果您可以获取类型,请执行此操作,因为 typescript 更易于编写和阅读:@ 987654322@ - 然后只需进入您的组件并“从 'heremaps' 导入 * as HereMap ”,其中 heremaps 是您刚刚安装的 index.d.ts 中声明的名称(npm install --save @types/heremaps)
  • 我让它工作了。你可以在下面看到我的代码。但我不认为这是一种优雅的方式。如果我使用“import * as HereMap from '@types/heremaps'”而不是“declare var H: any;”虽然不起作用。你知道为什么吗?如果我下载了脚本,我需要把它们放在哪里?他们进入资产文件夹吗?感谢您的帮助。
【解决方案2】:

您可以在特定组件中添加 js,例如

ngOnInit(){
  var scriptUrl = 'http://js.api.here.com/v3/3.0/mapsjs-core.js';
  let node = document.createElement('script');
  node.src = scriptUrl;
  node.type = 'text/javascript';
  node.async = true;
  node.charset = 'utf-8';
  document.getElementsByTagName('head')[0].appendChild(node);
}

【讨论】:

    【解决方案3】:

    我会回答我自己的问题:

    将脚本超链接添加到 index.html 是正确的方法。我错过了将 Javascript 代码转换为 TypeScript 的 TypeDefinition。

    https://www.npmjs.com/package/@types/heremaps

    上面的链接显示了从哪里获得这些。它可以通过以下方式安装:

    npm install --save @types/heremaps
    

    相应的文件被安装到“node-modules/@types/...” 如对以下问题的回答所述:

    Angular2: import external js file into component

    我还需要补充:

    declare var test: any;
    

    到我的组件。

    我现在可以访问所有五个外部脚本的所有功能。我的项目看起来像这样:

    index.html

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>See720</title>
      <base href="/">
    
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="icon" type="image/x-icon" href="favicon.ico">
    
      <link rel="stylesheet" href="http://js.api.here.com/v3/3.0/mapsjs-ui.css" />
      <script src="http://js.api.here.com/v3/3.0/mapsjs-core.js" type="text/javascript" charset="utf-8"></script>
      <script src="http://js.api.here.com/v3/3.0/mapsjs-service.js" type="text/javascript" charset="utf-8"></script>
      <script src="http://js.api.here.com/v3/3.0/mapsjs-ui.js" type="text/javascript" charset="utf-8"></script>
      <script src="http://js.api.here.com/v3/3.0/mapsjs-mapevents.js" type="text/javascript" charset="utf-8"></script>
      <script src="http://js.api.here.com/v3/3.0/mapsjs-pano.js" type="text/javascript" charset="utf-8"></script>
    
    </head>
    <body>
      <app-root></app-root>
    </body>
    </html>
    

    app.component.ts

    import {AfterViewInit, Component} from '@angular/core';
    
    declare var H: any;
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent implements AfterViewInit {
      title = 'C720';
    
      ngAfterViewInit() {
        // Initialize the platform object:
        let platform = new H.service.Platform({
          'app_id': '****',
          'app_code': '****',
          useCIT: true
        });
    
        document.body.style.backgroundColor = 'black';
    
        // Obtain the default map types from the platform object
        let defaultLayers = platform.createDefaultLayers();
    
        // // Instantiate (and display) a map object:
        let map = new H.Map(
          document.getElementById('mapContainer'),
          defaultLayers.normal.map,
          {
            zoom: 5,
            center: { lat: 52.5, lng: 13.5 }
          }
        );
        // document.getElementById('whiteSpace').style.backgroundColor = 'white';
        // Enable the event system on the map instance:
        var mapEvents = new H.mapevents.MapEvents(map);
        var ui = H.ui.UI.createDefault(map, defaultLayers);
    
        // Add event listeners:
        map.addEventListener('tap', function(evt) {
          // Log 'tap' and 'mouse' events:
          console.log(evt.type, evt.currentPointer.type);
        });
    
        // Instantiate the default behavior, providing the mapEvents object:
        var behavior = new H.mapevents.Behavior(mapEvents);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2016-11-16
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多