如何使用以角度扩展jQuery的bootstrap组件?

时间:2018-04-12 20:45:38

标签: angular typescript

我试图在一个新的角度4应用程序中使用bootstrap 3.3.7 popover组件(我不能使用ng版本),所以我安装了:

npm install --save jquery @types/jquery bootstrap

然后我将css和脚本添加到angular-cli.json

 "styles": [
    "../node_modules/bootstrap/dist/css/bootstrap.css",
    "../node_modules/bootstrap-tour/build/css/bootstrap-tour.css",
    "styles.css"
  ],
  "scripts": [
    "../node_modules/jquery/dist/jquery.js",
    "../node_modules/bootstrap/dist/js/bootstrap.js",
    "../node_modules/bootstrap-tour/build/js/bootstrap-tour.js"
  ]

然后在typings.d.ts文件中添加了一个界面:

interface Jquery { 
   popover(...any) : any;
}

然后在我的组件中我导入了jQuery:

import * as $ from "jquery"

但是当我尝试执行popover方法时,我收到编译错误:

('#test1').popover('show'); //here i have a compilation error on the popover method.

如何让打字稿识别出来?

1 个答案:

答案 0 :(得分:0)

这就是我如何使用cli创建一个新的Angular项目的方法:

npm install --save jquery bootstrap@3.3.7

app.component.ts更新为:

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

declare const $: any;

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

  ngAfterViewInit(): void {
    $(this.divElement.nativeElement).popover({content: 'foobar', placement: 'bottom'}).popover('show');
  }
}

app.component.html

<div #div>hello there</div>

由于angular-cli.json的脚本和样式添加将这些文件添加到全局范围中,因此按您现有的方式进行导入只会使您感到困惑。这将导致jQuery第二次导入,这一次将在引导脚本之后。

通常,最好以具有导入方式的方式进行导入,因为这将允许typescript / webpack加载所需的脚本并执行其他一些构建时魔术。由于版本3中的引导脚本依赖于jQuery的方式,全局范围脚本方法似乎是必需的。

尽管如此,为了防止打字稿出现问题,您需要通过全局declare const $: any;

告诉它有关全局jQuery对象的信息。

完整的GitHub存储库here

希望这会有所帮助!