开发者问题收集

在 .NET 生成的 Angular 4 应用程序中使用 jQuery/jQuery-UI

2017-10-01
238

我尝试在由 Microsoft 的 SpaTemplate/JavaScript 服务 (dontnet new angular) 生成的 Angular 4 应用程序中使用 jQuery / jQuery UI。这不使用 Angular-CLI,并且没有 angular-cli.json 文件。

我已经搜索过这个,在 SO 上找到了一些使用 CLI 生成的项目,但我似乎无法将其用于我的项目。

我已经通过 NPM 安装了 jQuery 和 jQuery-UI(jQuery 已经存在,但我根据另一个 SO 帖子的回答卸载并重新安装了它)。这会将它们都放在 node_modules 文件夹中,并将它们列在 webpack.config.vendor.js、package.json 和 package-lock.json 文件中。

webpack.config.vendor.js:

entry: {
        vendor: [
            '@angular/animations',
            '@angular/common',
            '@angular/compiler',
            '@angular/core',
            '@angular/forms',
            '@angular/http',
            '@angular/platform-browser',
            '@angular/platform-browser-dynamic',
            '@angular/router',
            'jquery',
            'jquery-ui',
            'bootstrap',
            'bootstrap/dist/css/bootstrap.css',
            'es6-shim',
            'es6-promise',
            'event-source-polyfill',
            'zone.js',
        ]
    },

package.json

"dependencies": {
"jquery": "^3.2.1",
"jquery-ui": "^1.12.1",
//others removed to keep this short

},

package-lock.json(依赖项部分)

    "jquery": {
  "version": "3.2.1",
  "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz",
  "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c="
},
"jquery-ui": {
  "version": "1.12.1",
  "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz",
  "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE="
},

现在,我不知道如何在组件 TS 文件中使用它们。我知道 jQuery 可以正常工作,因为此模板使用 Bootstrap,并且汉堡包导航在移动设备上运行良好。Bootstrap 使用 jQuery 制作下拉动画。

其他帖子说要将此添加到组件 TS 文件中:

declare var $:any;

当我尝试在组件的 ngOnInit 部分执行 $('#myElement').datepicker() 时,这样做会导致错误:

vendor.js?v=HQi6Yanr6lb0tcDpEWxOLi8IMea49FFYgwADBy-xMjk:31 ERROR Error: Uncaught (in promise): ReferenceError: $ is not defined
ReferenceError: $ is not defined

另一篇 SO 帖子说要这样做而不是声明:

import * as $ from 'jQuery';

由于它不知道 jQuery-UI,因此它给了我一个不同的错误:

[ts] Property 'datepicker' does not exist on type 'JQuery'.

最后,另一个答案说了这一点(针对 Angular2):

import $ from 'jquery';
import 'jqueryui';

但是,jquery 导入不起作用,因为它说 jquery 没有默认导出。我还必须将 jqueryui 更改为 jquery-ui。不管怎样,这都行不通。

我遗漏了什么?我似乎找到了相互矛盾的答案,它们都与使用 Angular-CLI 生成的应用程序有关,而我却没有机会使用它。感谢您的帮助。

2个回答

添加新引用后,您是否重建了供应商软件包? 每次向供应商配置添加新的 npm 包时,都应执行此命令:

webpack --config webpack.vendor.config.js
Pavel Agarkov
2017-10-01

看来您需要 JQuery 的类型定义。搜索 JQuery 的“@type/jquery”包并使用 NPM 添加它。

我会避免将 JQuery 与 Angular 一起使用,因为在大多数情况下,它们效果不佳。JQuery 在 DOM 上运行,而 Angular 在虚拟 DOM 上运行,这会导致很多混乱和错误。可以让它运行,但在很多情况下都很困难。第三方 jQuery 库也可能因此无法正常运行。

如果您需要 UI 组件,请使用一些专为 Angular 设计的组件:

Juergen Gutsch
2017-10-02