当前位置: 首页 > 知识库问答 >
问题:

WebPack:如何使angular自动检测jQuery并将其用作angular.Element而不是jQLite?

澹台镜
2023-03-14

我正在使用Webpack构建一个Angular 1.4项目。该项目利用了几个jQuery插件,这些插件被包装成angular指令。这些指令在内部使用angular.element,这可能意味着angular.element是真正的jQuery,而不是jQLite。

我想让angular自动检测jQuery并使用它而不是jQLite。我尝试在入口点模块app.js:require('jquery')中本地要求jquery,并使用require(expose?$!expose?jquery!jquery)全局公开jquery。

尽管如此,无论我做什么,angular.element都引用了JQLite。

我的研究有几个结果:

    null

详细信息:下面是我的app.js:

'use strict';

require("expose?$!expose?jQuery!jquery");
require("metisMenu/dist/metisMenu");
require("expose?_!lodash");
require("expose?angular!angular");

import angular from "angular";
import "angular-animate";
import "angular-messages";
import "angular-resource";
import "angular-sanitize";
import "angular-ui-router";
import "bootstrap/dist/css/bootstrap.css";
import "font-awesome/css/font-awesome.css";
import "angular-bootstrap";

require("../assets/styles/style.scss");
require("../assets/fonts/pe-icon-7-stroke/css/pe-icon-7-stroke.css");

// Import all html files to put them in $templateCache
// If you need to use lazy loading, you will probably need
// to remove these two lines and explicitly require htmls
const templates = require.context(__dirname, true, /\.html$/);
templates.keys().forEach(templates);

import HomeModule from "home/home.module";
import UniverseDirectives from "../components/directives";

angular.module("Universe", [
    "ngAnimate",
    "ngMessages",
    "ngResource",
    "ngSanitize",
    "ui.router",
    "ui.bootstrap",

    HomeModule.name,
    UniverseDirectives.name,
])
.config(function($urlRouterProvider, $locationProvider, $stateProvider){
    // $urlRouterProvider.otherwise('/');

    // $locationProvider.html5Mode(true);

    $stateProvider
      .state('test', {
        url: "/test",
        template: "This is a test"
      });
});

共有1个答案

胡鸿远
2023-03-14

我从John-Reilly那里得到了这个答案:
webpack angular和jquery的神秘案例

Bob-Sponge的回答不太正确--Provide插件实际上是在它处理的模块上进行文本替换,因此我们需要提供window.jquery(这是angular正在寻找的),而不仅仅是jquery

webpack.config.js中,需要将以下条目添加到插件中:

new webpack.ProvidePlugin({
    "window.jQuery": "jquery"
}),

这使用了webpack ProvidePleugin,并且在WebPackication(©2016年John Reilly)时,代码中对window.jQuery的所有引用都将替换为对包含jQuery的webpack模块的引用。因此,当您查看捆绑文件时,您将看到检查window对象是否有jQuery的代码如下所示:

jQuery = isUndefined(jqName) ?
  __webpack_provided_window_dot_jQuery : // use jQuery (if present)
    !jqName ? undefined : // use jqLite
    window[jqName]; // use jQuery specified by `ngJq`

这是对的;webpack为Angular提供了jQuery,但仍然没有将jQuery变量放置到窗口上。很漂亮吧?

 类似资料:
  • 我想要的操作:如果需要,在子表中插入一行会自动在父表中插入一行,否则将父表中现有行的id用作子表中插入行的外键。 我想知道是否有任何方法可以使用一个语句。 我使用Hibernate与Java和SQLite。以下是我关于数据库和配置的详细信息: 表家长: 表儿童: POJO家长: POJO儿童: 父母亲哈佛商学院: 小孩哈佛商学院: 现在,如果父项(具有相同的“描述”)不存在,则父项将与子项一起插入

  • 问题内容: 在Angular 1中,通过检查$ scope层次结构来进行更改检测。我们将在模板,控制器或组件中隐式或显式创建观察者。 在Angular 2中,我们不再具有$ scope,但是我们确实覆盖了setInterval,setTimeout等。我可以看到Angular如何使用它来触发$ digest,但是Angular如何确定发生了什么变化,特别是考虑到Object.observe从未进入

  • 我目前正在迭代一个数组,其中每个索引包含两个节点和一个关系(第1部分)- 我读了这篇文章,但我不明白如何实现它,使两个相同的节点具有相同的ID。我现在的代码是这样的: 创建两个节点 创造他们的关系 将关系添加到节点 坚持使用Neo4jTemplate.save() 我需要更改什么以合并而不是创建?我是否需要在持久化之前进行检查,或者在持久化SDN 4时是否有方法进行检查? 编辑: 我决定使用Neo

  • 问题内容: 我在我的网站上无法使用jQuery功能。它的作用是使用该 函数识别窗口何时更改其滚动位置,并在更改时调用一些函数以从服务器加载数据。 问题是滚动位置稍有变化并立即将数据加载到底部时,就会立即调用该函数。但是,我希望实现的是在滚动/页面位置到达底部时加载新数据,就像Facebook feed那样。 但是我不确定如何使用jQuery检测滚动位置吗? 问题答案: 您可以使用jQuery的方法

  • 问题内容: 我不明白何时对ajax请求使用Angular over jquery。 例如,为什么要使用: 代替 ?? 问题答案: 我的理解是,首选第一个原因有两个: $ http是可测试的。实际上,可以将其使用的后端存根并测试$ http请求,而无需 实际 发送请求。 $ http为您执行一些常见的“工作”,例如在POST请求中为您将内容类型设置为“ application / json”。 $

  • Maven shade插件创建的是否自动用于依赖于uberjar的项目(而不是普通的)? 在阅读了大量与dependency-reduced-pom.xml相关的问题并没有找到答案之后提出这个问题: 将dependency-reduced-pom.xml添加到基目录的Maven shade插件