我想知道如何从Typescript启动Twitter-Bootstrap。
$('.carousel').carousel()
我必须实现 jquery.d.ts 来修复$ -sign调用,但是我仍然遇到 .carousel()无法解决的错误可以在jquery.d.ts找到。
我尝试将javascript捆绑到一个模块并像这样调用它。但它似乎没有用。 这是我的代码:
carousel.d.ts
declare module 'carousel/carousel' {
var start: any;
export = start;
}
carousel.js
System.register('carousel/carousel', [], true, function () {
var carousel = function () {
function carousel() {
}
carousel.prototype.start = function () {
$('.carousel').carousel();
}
}
exports.carousel = carousel;
});
app.ts
import {Component} from "angular2/core";
import {bootstrap} from 'angular2/platform/browser';
import {Carousel} from "carousel/carousel";
@Component({
selector: "carousel",
bindings: [CarouselComponent],
templateUrl: 'carousel.html'
})
export class CarouselComponent {
start() {
carousel.start();
}
}
}
bootstrap(CarouselComponent)
感谢您提供帮助。
答案 0 :(得分:3)
问题是您没有carousel()
的输入定义。就像你提到的那样 - 它是Twitter-Bootstrap中的一个函数,但是你只为jQuery包含了输入定义(*。d.ts)。您需要以相同的方式将它们包含在Bootstrap中。
您可以从他们的GitHub或NuGet package获取DefinitelyTyped项目中的完整Bootstrap绑定定义。以下是必要部分:
interface CarouselOptions {
interval?: number;
pause?: string;
wrap?: boolean;
keybord?: boolean;
}
interface JQuery {
carousel(options?: CarouselOptions): JQuery;
carousel(command: string): JQuery;
}
答案 1 :(得分:1)
我会像这样重构你的carousel.js
文件:
System.register("carousel/carousel", [], true, function(require, exports, module) {
var carousel = function () {
function carousel() {
}
carousel.prototype.start = function () {
$('.carousel').carousel();
}
}
exports.carousel = carousel;
});
答案 2 :(得分:1)
创建一个文件“jquery-caroussel.d.ts”(并将其添加到您的reference.ts) 在里面:
interface JQuery {
carousel();
}
它会对ts编译器说,而不是有一个将在稍后实施的方法旋转木马()。 (在浏览器中,由carousel.js文件。)
如果你有另一个lib而不是轮播的问题,那么这里有大量的界面样本:https://github.com/DefinitelyTyped/DefinitelyTyped
答案 3 :(得分:0)
您可以通过为每个所需的库声明一个环境模块来导入JS文件。您可以拥有一个ambient.d.ts
文件,用于存储所有环境模块声明(即,您要导入的JavaScript库,但您没有类型定义)
ambient.d.ts:
// You would have a separate module declaration for each JavaScript library
// you want to import for which you do not have any type definitions
declare module 'my-module-i-want-to-import' {
const a : any;
export default a;
}
需要my-module-i-want-to-import
的任何其他* .ts文件:
// Include reference to your ambient module declarations
///<reference path="./ambient.d.ts" />
import myModule from 'my-module-i-want-to-import';
// Do something with myModule
console.log(myModule);
答案 4 :(得分:0)
最后,我改变了我的代码以使用“InjectionToken”。 如下所述:Use jQuery in Angular/Typescript without a type definition
您可以简单地注入jQuery全局实例并使用它。为此,您不需要任何类型定义或类型。
import { InjectionToken } from '@angular/core';
export const JQ_TOKEN = new InjectionToken('jQuery');
export function jQueryFactory() {
return window['jQuery'];
}
export const JQUERY_PROVIDER = [
{ provide: JQ_TOKEN, useFactory: jQueryFactory },
];
在app.module.ts中正确设置:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { JQ_TOKEN } from './jQuery.service';
declare let jQuery: Object;
@NgModule({
imports: [
BrowserModule
],
declarations: [
AppComponent
],
providers: [
{ provide: JQ_TOKEN, useValue: jQuery }
],
bootstrap: [AppComponent]
})
export class AppModule { }
您可以在组件中开始使用它:
import { Component, Inject } from '@angular/core';
import { JQ_TOKEN } from './jQuery.service';
@Component({
selector: "selector",
templateUrl: 'somefile.html'
})
export class SomeComponent {
constructor( @Inject(JQ_TOKEN) private $: any) { }
somefunction() {
this.$('...').doSomething();
}
}
答案 5 :(得分:-1)
1)添加以下 npm包
npm install --save-dev @types/jquery
npm install --save-dev @types/bootstrap
tsconfig.json 中的2)在类型数组中添加以下条目,
"types": [
"jquery",
"bootstrap",
]
现在你现在好了。