【问题标题】:Add .js scripts in Angular 2 project在 Angular 2 项目中添加 .js 脚本
【发布时间】:2017-05-29 21:29:52
【问题描述】:

我正在使用 Angular 2 框架构建一个 Web 应用程序,并且我想使用外部模板 (https://freehtml5.co/preview/?item=splash-free-html5-bootstrap-template-for-any-websites)。

我需要在我的组件模板中运行一些脚本(jquery.min.js、bootstrap.js、...),但如果我将其放入脚本标签中将无法正常工作。

如果我在 index.html 中运行脚本标签,它可以工作,但是当我浏览到另一个页面时,脚本不会重新加载。

如何在模板中加载没有脚本标签的脚本??

index.html

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Angular2App</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">

  <!-- Facebook and Twitter integration -->
  <meta property="og:title" content="" />
  <meta property="og:image" content="" />
  <meta property="og:url" content="" />
  <meta property="og:site_name" content="" />
  <meta property="og:description" content="" />
  <meta name="twitter:title" content="" />
  <meta name="twitter:image" content="" />
  <meta name="twitter:url" content="" />
  <meta name="twitter:card" content="" />

  <!--<link href="build/main.css" rel="stylesheet">-->
  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,700" rel="stylesheet">

  <!-- Animate.css -->
  <link rel="stylesheet" href="assets/css/animate.css">
  <!-- Icomoon Icon Fonts-->
  <link rel="stylesheet" href="assets/css/icomoon.css">
  <!-- Themify Icons-->
  <link rel="stylesheet" href="assets/css/themify-icons.css">
  <!-- Bootstrap  -->
  <link rel="stylesheet" href="assets/css/bootstrap.css">

  <!-- Magnific Popup -->
  <link rel="stylesheet" href="assets/css/magnific-popup.css">

  <!-- Owl Carousel  -->
  <link rel="stylesheet" href="assets/css/owl.carousel.min.css">
  <link rel="stylesheet" href="assets/css/owl.theme.default.min.css">

  <!-- Theme style  -->
  <link rel="stylesheet" href="assets/css/style.css">


  // SCRIPTS THAT I NEED TO LOAD
  <!-- Modernizr JS -->
  <script src="assets/js/modernizr-2.6.2.min.js"></script>
  <!-- FOR IE9 below -->
  <!--[if lt IE 9]>
    <script src="assets/js/respond.min.js"></script>
    <![endif]-->
  <!-- jQuery -->
  <script src="assets/js/jquery.min.js"></script>
  <!-- jQuery Easing -->
  <script src="assets/js/jquery.easing.1.3.js"></script>
  <!-- Bootstrap -->
  <script src="assets/js/bootstrap.min.js"></script>
  <!-- Waypoints -->
  <script src="assets/js/jquery.waypoints.min.js"></script>
  <!-- Carousel -->
  <script src="assets/js/owl.carousel.min.js"></script>
  <!-- countTo -->
  <script src="assets/js/jquery.countTo.js"></script>
  <!-- Magnific Popup -->
  <script src="assets/js/jquery.magnific-popup.min.js"></script>
  <script src="assets/js/magnific-popup-options.js"></script>
  <!-- Main -->
  <script src="assets/js/main.js"></script>
  // SCRIPTS THAT I NEED TO LOAD


</head>
<body>
  <app-root></app-root>
</body>
</html>

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { routing } from './app.routing.module';

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    routing
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
}

app.routing.module.ts

import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';

const routes: Routes = [
    {
        path: 'login',
        component: LoginComponent
    },
    {
        path: 'home',
        component: HomeComponent
    },
    {
        path: '',
        component: LoginComponent
    },
    {
        path: '**',
        component: LoginComponent
    }
];

export const routing = RouterModule.forRoot(routes);

app.component.ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {
}

app.component.html

<router-outlet></router-outlet>

【问题讨论】:

标签: javascript html angular typescript


【解决方案1】:

如果您使用的是 Angular CLI,您可以将来自您的 node_modules.js 文件包含在您的 .angular-cli.json 中。

styles 数组的正下方和environmentSource 的上方,您应该会看到scripts 数组。我已经包含了一点(我已经截断了)JSON 作为你的参考。

{
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": [
        "assets",
        "favicon.ico"
      ],
      "index": "index.html",
      "main": "main.ts",
      "styles": [
        "styles.scss"
      ],
      "scripts": [
        "../node_modules/hammerjs/hammer.min.js"
      ],
      "environmentSource": "environments/environment.ts",
      "environments": {
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ]
}

【讨论】:

  • 我将补充一点,使用带有 SPA 的 JQuery 会出现的一个问题是,通常 JQuery 和 Bootstrap 会在 DOM 渲染完成时绑定它们的所有侦听器。由于 SPA 在不刷新页面的情况下加载内容,因此您可能需要在 ngAfterViewInit 生命周期挂钩期间手动将侦听器添加到新绘制的组件。
  • 作为重要说明,您必须重新启动 ng serve 才能有效加载样式/脚本
  • A small doc 也可以避免多次加载
【解决方案2】:

我认为在 angular 2 组件中加载脚本标签是不允许的,但看看这个可能对你有帮助 How do I include a JavaScript file in another JavaScript file?

【讨论】:

    【解决方案3】:

    组件模板中不允许使用脚本标签。在您的index.html 中包含脚本应该使它们可以全局访问。当您说您正在浏览另一个页面时,不清楚您的意思是什么,但是如果您使用带有router-outlet 的角度路由器,您导入的所有脚本都应该可以访问。

    【讨论】:

    • 感谢您的回答。如您所见,我在index.html 中包含了脚本,并且第一页运行良好......问题是当我路由到另一个需要加载相同脚本的页面(从登录页面到主页)时。页面加载正常,没有错误,但由于未加载脚本,页面保持空白。如果我刷新浏览器,页面会再次显示正常。正如你所说,我使用带有&lt;router-outlet&gt;的角度路由器。我用我的app.componentapp.module.tsapp.routing.module.ts 更新了这个问题。
    • 我注意到,如果我启用 Toggle Device Toolbar(在 Chrome DevTools 视图中),问题就会消失。
    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2017-10-26
    • 1970-01-01
    • 2017-12-01
    • 2020-10-19
    相关资源
    最近更新 更多