【问题标题】:bower_component jquery plugins not being invoked in angularjs appbower_component jquery插件未在angularjs应用程序中调用
【发布时间】:2016-05-09 19:05:33
【问题描述】:

概述

我有几个打算在 AngularJS 应用程序中使用的 jQuery 插件。我通过 bower 安装我的 jQuery 插件。我使用 gulp-inject 将这些依赖项放在我的主 html 中。我在加载角度之前加载 jquery。我正在获取我获得的模板并将其组织起来,类似于 John Papa 处理他的Hot Towel AngularJS generator

问题

没有调用旨在扩展 jQuery 的库。这些文件已加载,但从未制作过 jQuery 上的扩展名。以这两个 jQuery 插件为例:remarkable-bootstrap-notifyjquery.sparkline。这两个,当加载到页面中时,都会给出一个错误,指出我正在调用的来自这些库的函数之一不存在。


我尝试过的

如果我在浏览器中加载的文件中设置断点,我注意到上面的工厂代码确实被调用了,但是执行扩展(添加新功能)的代码没有运行。如果我通过添加一个 ...}(jQuery))) 来更改加载到我的页面中的 remarkable-bootstrap-notify 文件,它之前只是读取 ...})),那么该库突然开始工作。

我在 jquery.sparkline 库上尝试了同样的修复,但这并不能使库正常工作。

显然,这不是一个理想的解决方案,因为下次我通过 bower 引入该库时,我的更改不再存在,从而破坏了我的应用程序依赖于这些库的功能。

注意

我正在尝试在指令中使用这些 jQuery 插件。这不是先发制人的想法,但我一直在读到这是解决人们与我的问题相似的问题的方法。但是,这对我来说没有任何区别。

更新

我现在已将此“修复”应用于 3 个库,暂时修复了该问题(jquery.sparkline、jquery.easypiechart 和 bootstrap-notify)。我的问题现在有一个更具体的更新,希望得到答复。


问题

拥有一个带有 jQ​​uery 插件依赖项的 AngularJS 应用程序似乎并不是一件愚蠢的事情,我认为这将是相当简单的。我会错过什么通常允许它工作的东西?我可以做些什么来处理我通过 bower 引入的所有这些依赖项?

更新

我的bower_components 文件夹中现在有 3 个库需要手动编辑才能工作。从图形上讲,我必须添加以下内容(在下图中突出显示)才能使库在我的应用程序中工作:

(这只是这些典型 jQuery 插件顶部出现的示例)

改写的问题:当我添加...(jQuery)... 时,我在做什么,而不是“我正在调用匿名函数,将jQuery 对象作为参数传递。”我得到那么多。但是为什么这不包含在我通过 bower 下载的库中?我的应用程序会迫使我进行这些手动编辑吗?这不可能是这些库的正常使用方式...

【问题讨论】:

  • 你能设置一个最小的 jsfiddle 来解决错误吗?
  • 我会尝试的。到目前为止失败了好几次。
  • @JakeSmith 如果您仅使用 jQuery 和插件创建一个最小示例,您的问题是否也会出现?
  • @ssc-hrep3,目前还没有:(
  • @ssc-hrep3,好像是这样。约翰对我应该如何前进越来越正确。我只是希望我能理解为什么在应用程序架构方面遵循更好的做法并使用像 bower 这样的工具(与我购买的模板中的硬编码和过时的库不同)会破坏应用程序。我以为我是在引入稳定性,而不是展示脆弱性。

标签: javascript jquery angularjs jquery-plugins


【解决方案1】:

快速提问:你在说什么 jQuery 插件?为什么要尝试将 jQuery 代码破解到 Angular 中,您通常可以在其中找到已经为 Angular 编写的相同或更好的插件。

remarkable-bootstrap-notify 可以替换为AngularJS-toaster

jquery.sparkline 可以替换为Angular-chart

这是来自 docs.angularjs.org:

DOM 操作

停止尝试使用 jQuery 修改控制器中的 DOM。真的。这包括添加元素、删除元素、检索它们的内容、显示和隐藏它们。使用内置指令,或在必要时编写自己的指令来进行 DOM 操作。有关复制功能,请参见下文。

如果您正在努力改掉这个习惯,请考虑从您的应用程序中删除 jQuery。真的。 Angular 有 $http 服务和强大的指令,这几乎总是不必要的。 Angular 捆绑的 jQLite 具有一些最常用于编写 Angular 指令的特性,尤其是绑定到事件。

【讨论】:

  • 感谢您的建议。我买了一个模板,里面有很多代码。所以是的,这是一种解决方案。一个我不想立即走向的。这是我采用的一个相当大的代码库。至于在我的控制器中使用 jQuery 进行 DOM 操作,我完全同意这是一个很大的禁忌。但是,我只调用了那些 jQuery 库的 init 函数。我不确定这是否真的回答了我的问题。将 Angular 排除在等式之外,同样的问题仍然存在。为什么我必须在最后手动添加该调用?
  • 您应该采用这个答案作为您的解决方案,并用它们的角度等效项替换这些 jquery 库。你是对的,这并没有回答为什么你需要明确要求 jquery 才能使其工作的问题,但这可能是在浪费你的时间,因为你应该从一开始就使用角度服务和库。作为一般规则,如果您发现自己不得不覆盖 bower 目录中的库文件,则需要重新定义问题所在。在这种情况下,它试图将这些不必要的 jquery 库塞进一个 Angular 应用程序中。
  • @Jake Smith 购买模板并没有错,我还购买了一个模板来启动我的项目,但我购买了一个 Angular 模板。通过这种方式,您可以了解其他开发人员如何将这样的项目组合在一起,并通过阅读他们的代码来学习。我的所有库和插件也坚持使用 Angular,到目前为止完全没有问题。
  • @johan,这是一个 Angular 模板,但由于某种原因,它包含 Angular 本质上调用 jquery 库。我希望我在买之前就知道我在买什么。顺便说一句,谢谢你的帮助!
  • @JakeSmith 我会留下差评,警告其他人不要使用该模板,我不知道是否允许,发布一个链接以便其他开发人员不会购买该模板。我买了 minovate 模板,效果很好。 tattek.sk/minovate
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多