【问题标题】:How can I use jQuery in an Angular 8 app?如何在 Angular 8 应用程序中使用 jQuery?
【发布时间】:2019-07-08 20:07:43
【问题描述】:

我有一个利用 SignalR 与桌面应用程序通信的应用程序。要使用 SignalR,我需要在我的 .ts 文件中使用 jQuery。但是,从 Angular 7 迁移到 Angular 8 后,它似乎不起作用。

我使用declare var $: any;,就像在以前版本的 Angular 中一样。不幸的是,$ 现在在控制台打印空白。

那么,Angular v8 不再支持以这种方式使用 jQuery,还是在迁移过程中出现了其他问题?

更新:

我通过 npm 加载了 jQuery v3.3.1。

这使它成为全局(在 angular.json 中)

"scripts": [
         "./node_modules/jquery/dist/jquery.min.js",
         "./node_modules/signalr/jquery.signalR.js"
]

【问题讨论】:

  • 更新您的帖子,了解您如何实际使用 jquery 并将其注入您的应用程序

标签: javascript node.js angular typescript angular8


【解决方案1】:

不使用更优雅的方式

declare var $: any;

第一次运行

npm install jquery --save
npm install @types/jquery --save

然后在架构师的脚本部分 => 构建 angular.json 文件添加 jquery 库的路径

"scripts": [
  "node_modules/jquery/dist/jquery.min.js"
]

然后在你的 tsconfig.app.json 中

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": ["jquery"] // add here
  },
  "exclude": ["test.ts", "**/*.spec.ts"]
}

所以现在您可以在项目中的任何地方使用 jquery,而无需为每个需要使用 jquery 的文件使用 declare var $ : any

【讨论】:

  • 这太棒了!我不经常在我的 .ts 文件中使用 jQuery,所以我经常忘记declare var $: any;
  • 是的,将它添加到 tsconfig.app.json 是关键 以前我看到另一个答案将它放在 tsconfig.json 文件中,但没有帮助。
  • 错误 TS2688 中的错误:找不到“jquery”的类型定义文件。
  • @Stanley 删除 yarn-lock 和 package-lock.json 文件然后再次运行 npm install
  • 如果你使用NX.Dev /库,那么还要在文件中添加"types": ["jquery"]tsconfig.lib.json在你想使用jquery的每个库中
【解决方案2】:

Angular 8 适用于 JQuery。

 "dependencies": {
  ...
  "jquery": "^3.4.1",
  ...
}

在您的 angular.json 文件中导入所需的文件,如下所示:

"scripts": [
     "node_modules/jquery/dist/jquery.min.js"
]

开头没有./,只有node_modules/...

在你的 app.module 中验证它是这样工作的:

import { AppComponent } from './app.component';

declare var $: any;
console.log(`jQuery version: ${$.fn.jquery}`);

@NgModule({

在开发者工具控制台中它应该打印这个:

jQuery 版本:3.4.1

【讨论】:

  • 出于某种原因,我的 angular.json 确实需要 ./ 在脚本路径的开头。您的回答确实帮助我诊断了手头的问题,这最终成为我之前遇到此问题的另一个包。看我的回答。
  • 这不是一个好的解决方案,因为您将 $ 声明为 any,因此您将没有类型检查和智能感知...
  • @Mick 分享您的解决方案
【解决方案3】:

所以,在稍微远离这个问题并使用 roberts 回答确认 jQuery 在 app.module.ts 中工作(我不知道 console.log 会在导入过程中工作)之后,我意识到我上次将 v4 升级到 v7 时已经解决了这个问题。

发生了什么,是一个依赖导致 jQuery 被重新加载。启动 signalR 通信的应用程序部分还加载了另一个依赖项 (telerik-angular-report-viewer),这导致 console.log($) 没有显示任何内容,因为尚未将 jQuery 加载到组件中。

修复:

删除以下代码

window.jQuery = jQuery;
window.$ = jQuery;

来自以下文件

  • 依赖\telerikReportViewer.kendo.min.js
  • 依赖\telerikReportViewer.js
  • cjs\telerik-report-viewer.component.js
  • es\telerik-report-viewer.component.js

【讨论】:

  • Tony 的回答很有帮助,但并未完全提供解决方法。我接受了我的回答,因为它详细说明了问题的确切原因,并且可以帮助其他可能在其他库中遇到类似问题的人。
  • 您问的是 X,但回答的是 Y。您在问题中没有提到 Telerik,而支持 Tony 的 21 位可能也不使用 Telik。从文件中删除行并不总是一种选择。其他答案是通用的。
  • 实际上,我的问题是问它是否仍然按照我的方式工作,或者是否有其他问题。您希望我接受的答案只是提供了一种更好的加载 jquery 的方法,但不能解决我的问题(我试过)。我接受了我的回答,为我的具体情况提供了详细信息,并将帮助可能遇到与我相同的问题的其他人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多