【问题标题】:How to use jQuery UI with Angular 2如何在 Angular 2 中使用 jQuery UI
【发布时间】:2017-06-11 05:11:14
【问题描述】:

因为我想在我的应用程序中加入拖放功能,所以我决定将 jQuery UI 导入到我的 Angular 2 项目中。

首先我通过执行以下操作导入 jQuery 本身:

import { ElementRef } from '@angular/core';
declare var jQuery:any;

ngOnInit() {
    jQuery(this._elRef.nativeElement).find('ul.tabs').tabs();
}

这非常适合初始化东西。但是当我尝试使用.draggable() 函数时,我收到以下错误:

jQuery(...).draggable is not a function

我怎样才能做到这一点?我阅读了很多方法,但它们都使用了 system-js,在 Angular-cli 的当前版本中我不使用。我知道在 Angular 2 应用程序中使用 jQuery 并不是最好的方法,但我只需要一个网格,用户可以在其中放置可拖动的小部件。

如果您有任何建议,那将是完美的!谢谢!

【问题讨论】:

  • 您是否在某处加载了 JQuery UI 库?例如,您的index.html 文件中是否有脚本标签?
  • 是的,我在 jQuery 库之后的 index.html 中加载它
  • @GeorgiArnaudov 你能分享一下 plunker 的例子吗

标签: javascript jquery jquery-ui angular


【解决方案1】:

我设法通过以下步骤使其工作:

  1. npm 卸载 jquery jquery-ui
  2. npm 缓存清理
  3. npm install jquery jquery-ui
  4. 在 angular-cli.json 中,我在脚本对象中添加了我的 jquery 和 jquery-ui 路径。这是他们的样子:

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

完成这些步骤后,它就像一个魅力。希望对遇到问题的人有所帮助。

【讨论】:

  • 您能否举例说明步骤 3 中的路径是什么样的? — 谢谢 :)
  • 举个例子
  • @f.b.抱歉耽搁了,我编辑了答案并添加了 angular-cli.json 中的 scrips 数组的样子。
  • 这似乎很奇怪......如果你卸载 jquery 和 jquery-ui,它们怎么还在你的 node_modules 文件夹中?
  • 可能缺少 npm 安装,或者卸载实际上是为了安装?
【解决方案2】:

npm install jquery jquery-ui --save

npm install @types/jquery --save-dev

import * as $ from 'jquery';
import 'jquery-ui/ui/widgets/selectable.js';

用法:

ngAfterViewInit(): void {
    ($('.selectable') as any).selectable({..});
}

您可能还想导入样式表 如果使用 sass,则在 style.scss 上

@import '../node_modules/jquery-ui/themes/base/selectable.css';

在 .angular-cli.json 中

"styles": [
      "../node_modules/jquery-ui/themes/base/selectable.css",
      "./styles.scss"
],

【讨论】:

    【解决方案3】:

    我将 angular2 与 jqueryUI 一起使用。你需要导入jquery和jqueryUI

    //SystemJS
    
    System.config({
        defaultJSExtensions: true,
        paths: {
            // paths serve as alias
            'npm:': 'node_modules/'
        },
        map: {
            'app':  'app',
    
            // angular bundles
            '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
            '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
            '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
            '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
            '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
            '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
            '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
            '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
            // other libraries
            'rxjs': 'npm:rxjs',
    
            jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js',
            jqueryui: 'npm:jqueryui/jquery-ui.min.js',
    
            material: 'npm:material-design-lite/dist/material.min.js'
        },
        packages: {
            app: { main: 'main', format: 'register', defaultExtension: 'js' },
            'rxjs': { defaultExtension: 'js' }
        },
    });
    
    ///////////////////////////////
    

    //Angular2组件

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

    【讨论】:

    • 其实我不使用 System JS。我使用现在使用 Webpack 的 Angular-cli。
    【解决方案4】:

    您选择的元素可能尚不可用,因此选择器无法找到该元素。

    您可能应该在 ngAfterViewInit 生命周期钩子(类似于 ngOnInit)中调用 .draggable() 以确保在附加之前存在 DOM 元素。

    【讨论】:

    • 我实际上尝试了您的建议,但没有成功。我什至在 ngAfterViewInit 挂钩中放置了一个 setTimeout 函数 5 秒,并且在元素尝试初始化之前没有错误。还有其他建议吗?
    • @GeorgiArnaudov 如果您记录 jQuery(元素)会发生什么?它打印什么吗?
    • 我记录了它并返回了一个包含我的项目的对象,所以 jQuery 正在工作。但是为了让 jQuery UI 也能正常工作,我还应该做些什么呢?我在 jQuery 之后包含了脚本,然后为 jQuery 和 jQuery UI 安装了类型。我还尝试通过 npm 安装它,当我检查 node_modules 文件夹时,我发现没有构建它。然后,当我导入“jquery-ui”时,它给了我另一个错误:$.each 不是函数。所以我真的不知道为什么会这样……
    • 问候,有一种方法可以支持小部件或使用 angular2+ 的任何东西,只需安装这里已经提到的软件包,然后像这样导入小部件的特定 js import 'jquery-ui/ui/widgets/可选择的.js';然后在 jquery 选择器中像这样使用强制转换 ($('.selectable') as any).selectable()
    【解决方案5】:

    ### 重要 ###

    错误

    import * as $ from 'jquery';
    import 'jquery-ui-dist/jquery-ui';
    

    因为编译器有问题。
    正确

    declare var require: any
    var $ = require('jquery');
    require('jquery-ui-dist/jquery-ui');
    


    declare var require: any
    var $ = require('jquery');
    import 'jquery-ui-dist/jquery-ui';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2017-01-13
      • 2017-09-15
      相关资源
      最近更新 更多