首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引导w/角“错误:$(.).collapse()不是函数”

引导w/角“错误:$(.).collapse()不是函数”
EN

Stack Overflow用户
提问于 2018-04-13 16:18:36
回答 5查看 8.2K关注 0票数 5

我是新手,当用户点击链接时,我尝试从角控制器中的Javascript激活.collapse()函数。当单击其中一个链接时,这将关闭可折叠的导航条(因为路由由角控制,不会导致页面刷新)。

以下错误显示:

代码语言:javascript
复制
ERROR TypeError: $(...).collapse is not a function
    at HTMLAnchorElement.<anonymous> (header.component.ts:18)
    at HTMLAnchorElement.dispatch (jquery.js:5183)
    at HTMLAnchorElement.elemData.handle (jquery.js:4991)
    at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:4740)
    at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:420)
    at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:188)
    at ZoneTask.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:496)
    at invokeTask (zone.js:1540)
    at HTMLAnchorElement.globalZoneAwareCallback (zone.js:1577)

HTML模板的相关部分:

代码语言:javascript
复制
<div class='collapse navbar-collapse' id='mainNavbar'>
  <div class='navbar-nav'>
    <div [ngClass]='{ "nav-item": true, active: pageTitle === "Home" }'>
      <a class='nav-link' routerLink='/'>Home</a>
    </div>
    <div [ngClass]='{ "nav-item": true, active: pageTitle === "Request" }'>
      <a class='nav-link' routerLink='/request'>Request</a>
    </div>
    <div [ngClass]='{ "nav-item": true, active: pageTitle === "Volunteer" }'>
      <a class='nav-link' routerLink='/volunteer'>Volunteer</a>
    </div>
    <div [ngClass]='{ "nav-item": true, active: pageTitle === "About" }'>
      <a class='nav-link' routerLink='/about'>About</a>
    </div>
  </div>
</div>

主计长的有关部分:

代码语言:javascript
复制
// importing jquery from npm module
import * as $ from 'jquery';

// inside the controller class
ngOnInit() {
  $('.nav-link').click(() => $('.collapse').collapse('toggle'));
}

包括脚本(在.angular-cli.json中):

代码语言:javascript
复制
"scripts": [
  "../node_modules/jquery/dist/jquery.min.js",
  "../node_modules/popper.js/dist/umd/popper.min.js",
  "../node_modules/bootstrap/dist/js/bootstrap.min.js"
]

我见过像这样的多个问题,但几乎所有的答案都是为了确保jQuery包含在引导之前,并且Bootstrap不包括两次。这里的情况也是如此。

其他jQuery功能(正常折叠功能)正在正常工作。如果我尝试在下拉列表中使用.dropdown()函数,也会出现同样的错误。

这里有什么问题?

如果您需要:角5,引导v4.0.0 (npm模块),jQuery v3.3.1 (npm模块)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-13 17:24:09

您需要使用declare let $ : any;而不是导入

我想如果你用

代码语言:javascript
复制
import jquery as $ from 'jquery';

然后,这意味着$将只包含jquery包中定义的代码,而不是由引导程序(或任何其他jquery插件)声明的附加插件。

如果您使用

代码语言:javascript
复制
declare let $ : any;

然后$表示正常的jQuery函数加上附加插件(折叠、下拉、.)由其他图书馆添加

如果您不想使用any,并且需要明确地调用一些插件方法,则需要扩展jQuery的接口

代码语言:javascript
复制
interface JQuery 
{
    carousel(options : any);
}

declare let $: JQuery;

如果您可以避免使用jquery或jquery插件,则当本机角度方法可用时,应避免使用jquery或jquery插件。

对于引导,如ConnorsFan提到的,您可以使用ng-自助作为替代。它需要引导CSS文件,但是动态组件已经用本机角重写,而不需要jQuery。

票数 9
EN

Stack Overflow用户

发布于 2018-04-13 16:52:37

经过更多的研究,我发现这个堆栈溢出回答建议添加以下一行(替换import * as $ from 'jquery'):

代码语言:javascript
复制
declare let $: any;

不幸的是,我不明白这意味着什么或者它是如何工作的,但它为我解决了这个问题。希望这能帮上忙。

票数 2
EN

Stack Overflow用户

发布于 2019-10-21 16:05:22

使用:

declare let $ : any;

而不是:

import * as $ from 'jquery';

作为一种解决办法,您可以使用:

$('#yourId').removeClass('show');

(供其他用户使用)

请确保您在angular.json上的设置类似于以下问题:

代码语言:javascript
复制
"scripts": [
    "node_modules/jquery/dist/jquery.min.js",
    "node_modules/popper.js/dist/umd/popper.min.js",
    "node_modules/bootstrap/dist/js/bootstrap.min.js"
 ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49821320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档