Bootstrap 4 Карусель работает в Angular 2? Ошибка: свойство «карусель» не существует для типа «JQuery».

Я пытаюсь заставить карусель Bootstrap 4 работать в моем приложении Angular 2. В частности, я пытаюсь воспроизвести эффект полной ширины, сделанный здесь. Я дошел до последнего бита, где мне нужно подключить элемент к карусели:

$('.carousel').carousel({
  interval: 6000,
  pause: "false"
});

Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

Ошибка: свойство «карусель» не существует для типа «JQuery».

Я знаю, что существуют компоненты ng-bootstrap, но я не был Таким образом, карусель может быть полностью во всю ширину.

Вот мой код (Typescript, CSS, HTML):

import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';

@Component({
  selector: 'app-home-carousel',
  templateUrl: './home-carousel.component.html',
  styleUrls: ['./home-carousel.component.css']
})
export class HomeCarouselComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

  setupCarousel(): void {
    var $item = $('.carousel .item'); 
    var $wHeight = $(window).height();
    $item.eq(0).addClass('active');
    $item.height('400px'); 
    $item.addClass('full-screen');

    $('.carousel img').each(function() {
      var $src = $(this).attr('src');
      var $color = $(this).attr('data-color');
      $(this).parent().css({
        'background-image' : 'url(' + $src + ')',
        'background-color' : $color
      });
      $(this).remove();
    });

    $(window).on('resize', function (){
      $wHeight = $(window).height();
      $item.height($wHeight);
    });

    $('.carousel').carousel({  // <-- ERROR is on the .carousel
      interval: 6000,
      pause: "false"
    });    
  }
}
h3 {
  display: inline-block;
  padding: 10px;
}

.full-screen {
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  height: 300px;
}
<div id="mycarousel" class="carousel slide" data-ride="carousel">
  <!-- Indicators -->
  <ol class="carousel-indicators">
    <li data-target="#mycarousel" data-slide-to="0" class="active"></li>
    <li data-target="#mycarousel" data-slide-to="1"></li>
    <li data-target="#mycarousel" data-slide-to="2"></li>
    <li data-target="#mycarousel" data-slide-to="3"></li>
    <li data-target="#mycarousel" data-slide-to="4"></li>
  </ol>

  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">
    <div class="item">
        <img src="https://unsplash.it/2000/1250?image=397" data-color="lightblue" alt="First Image">
        <div class="carousel-caption">
            <h3>First Image</h3>
        </div>
    </div>
    <div class="item">
        <img src="https://unsplash.it/2000/1250?image=689" data-color="firebrick" alt="Second Image">
        <div class="carousel-caption">
            <h3>Second Image</h3>
        </div>
    </div>
    <div class="item">
        <img src="https://unsplash.it/2000/1250?image=675" data-color="violet" alt="Third Image">
        <div class="carousel-caption">
            <h3>Third Image</h3>
        </div>
    </div>
    <div class="item">
        <img src="https://unsplash.it/2000/1250?image=658" data-color="lightgreen" alt="Fourth Image">
        <div class="carousel-caption">
            <h3>Fourth Image</h3>
        </div>
    </div>
    <div class="item">
        <img src="https://unsplash.it/2000/1250?image=638" data-color="tomato" alt="Fifth Image">
        <div class="carousel-caption">
            <h3>Fifth Image</h3>
        </div>
    </div>
  </div>

  <!-- Controls -->
  <a class="left carousel-control" href="#mycarousel" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#mycarousel" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>

Вот мой файл index.html:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Website</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"
        integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <div class="my-fluid-container">
    <div class="row">
      <div class="col-md-12 app-container">
        <app-root>Loading...</app-root>
      </div>
    </div>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.1/imagesloaded.pkgd.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"
          integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"
          integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"
          integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
</body>
</html>

Спасибо за любую помощь!


person Eddie    schedule 08.02.2017    source источник


Ответы (4)


Шаг 1. Убедитесь, что у вас есть jQuery и Bootstrap.js, упомянутые в разделе сценариев angular-cli.json.

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

Шаг 2. В вашем home-carousel.component.ts сразу после import { Component, OnInit } from '@angular/core'; добавьте declare var $:any; вот так:

import { Component, OnInit } from '@angular/core';
declare var $:any;

Шаг 3. Хотя это и не обязательно, но я считаю более безопасным разместить код jQuery и JS внутри ngOnInit() следующим образом:

ngOnInit() {
    $('.carousel').carousel({
        interval: 2000
    });
}

Я надеюсь, что это работает.

person Donnie Ashok    schedule 03.03.2018
comment
Для меня declare var $:any; сделал работу, а import * as $ from 'jquery'; нет - person StinkyCat; 08.09.2018
comment
Добавления scripts привели к сбою моей сборки продукта, но использование только шагов 2 и 3 заставило меня работать на angular 10. - person brt; 01.04.2021

У меня была такая же проблема, и я смог решить ее, изменив

import * as $ from 'jquery';

to

declare var jQuery: any;

Похоже, первый создает новый экземпляр jQuery; тогда как второй обращается к глобальному экземпляру, к которому прикреплены функции начальной загрузки (карусель, модальный... и т. д.). Вы можете подтвердить это, добавив следующее в свой класс компонента и переключившись между двумя операторами импорта, упомянутыми выше.

console.log($.fn.carousel);
console.log($.fn.modal);

Подробнее об объявлении ключевого слова: Что делает "объявление" в "экспорте". объявить действия класса?

Об операторе импорта TypeScript: https://www.typescriptlang.org/docs/handbook/modules.html

person MAhsan    schedule 01.03.2018

Ваша проблема в том, что вы не импортировали bootstrap или импортировали его неправильно. В вашем index.html убедитесь, что вы импортируете bootstrap после jQuery следующим образом:

<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"></script>

Не вы должны быть в состоянии использовать карусель.

person Deutro    schedule 08.02.2017
comment
Я пробовал это, хотя я считаю, что на них ссылаются правильно (сначала jquery, затем bootstrap), но это не имело никакого значения. Я все еще получаю ошибку машинописного текста выше. В любом случае, я не уверен, как это поможет с машинописным текстом, но я попробовал. Спасибо - person Eddie; 08.02.2017
comment
Ну не в комментарии не могу, слишком длинно. Но я в основном скопировал HTML точно из ссылки Codpen, которую я включил в свой исходный пост - codepen.io/SitePoint /pen/ZbGwqe. Я использую тот же CSS, и я создал функцию setupCarousel, в которую я также скопировал весь JS из этого Codepen. В нижней части JS я вызываю карусель и присоединяю ее к элементу, используя имя класса, чтобы выбрать его (.carousel). Я установил jquery и bootstrap через npm и могу подтвердить, что они установлены правильно. - person Eddie; 08.02.2017
comment
Вы можете отредактировать свой вопрос и вставить туда свой код. Это облегчит вам помощь. - person Deutro; 08.02.2017
comment
Не могли бы вы добавить свой index.html. Я только что попытался воспроизвести ошибку, но для Materialize в моем проекте, и я получаю точно такую ​​​​же ошибку, если удаляю файл js из Materialize. - person Deutro; 08.02.2017
comment
Хорошо, добавил index.html. - person Eddie; 08.02.2017
comment
Можете попробовать поместить файлы скриптов в тег ‹head›‹/head›? - person Deutro; 08.02.2017
comment
Да, это тоже не работает, и вам действительно не нужно помещать ссылки на скрипты в тег head. Я использую код Visual Studio для создания этого и ошибка в самом Typescript. Ссылочная позиция не должна иметь никакого значения для Typescript. Это ошибка сборки... Не компилируется. - person Eddie; 08.02.2017

Я сейчас с той же проблемой, пытаясь сделать это в своем приложении:

https://www.bootply.com/89193

$('.carousel').carousel({ // ‹-- ОШИБКА на .carousel

Вот как выглядит мой index.html:

    <html>
<head>
    <meta charset="utf-8">
    <base href="/">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"
            integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.1/imagesloaded.pkgd.min.js"></script>
</head>
<body>
    <app-root>
        <div class="spinner">
            <div class="double-bounce1"></div>
            <div class="double-bounce2"></div>
        </div>
    </app-root>
</body>
</html>

Я думаю, что у меня есть правильный бутстрап и jquery

person Break    schedule 12.01.2018