gpt4 book ai didi

angular - 如何在 Angular2 中使用 owl-carousel 异步更改 ng-content

转载 作者:太空狗 更新时间:2023-10-29 18:26:42 24 4
gpt4 key购买 nike

我正在尝试将 owl-carousel 实现到我的 Angular 2 应用程序中。

我按照这个例子How to use owl-carousel in Angular2?它实际上很好地解决了我的项目是异步更改(ng-​​content 异步更改)的唯一问题。

当我的 owl-courosel 的内容发生变化(推荐者或贬低者)时,通过在 plnkr 上实现解决方案,插件不会重新加载。所以我只看到项目列表,但它们不会滚动。

所以我有 nps-comments.component.html,其中调用了轮播组件:

<section class="purchasers comments" *ngIf="comments.promoters.length || comments.detractors.length">
<carousel class="promoters" *ngIf="comments.promoters.length" [options]="{ items: 1 }">
<p *ngFor="let promoter of comments.promoters">{{promoter}}</p>
</carousel>
<carousel class="detractors" *ngIf="comments.detractors.length" [options]="{ items: 1 }">
<p *ngFor="let detractor of comments.detractors">{{detractor}}</p>
</carousel>
</section>

然后是实际的carousel.component.ts

import {
Component,
Input,
ElementRef
} from '@angular/core';

import 'jquery';
import 'owl-carousel';

@Component({
moduleId: module.id,
selector: 'carousel',
templateUrl: 'carousel.component.html',
styleUrls: ['carousel.component.css']
})

export class CarouselComponent {
@Input() options: Object;

private $carouselElement: any;

private defaultOptions: Object = {};

constructor(private el: ElementRef) { }

ngAfterViewInit() {
for (let key in this.options) {
if (this.options.hasOwnProperty(key)) {
this.defaultOptions[key] = this.options[key];
}
}

let outerHtmlElement: any = $(this.el.nativeElement);
this.$carouselElement = outerHtmlElement.find('.owl-carousel').owlCarousel(this.defaultOptions);
}

ngOnDestroy() {
this.$carouselElement.trigger('destroy.owl.carousel');
this.$carouselElement = null;
}
}

这是 carousel.component.html:

<div class="owl-carousel owl-theme">
<ng-content></ng-content>
</div>

任何帮助将不胜感激。谢谢。

最佳答案

我正在分享我使用 owl owl.carousel@2.1.4 和 angular 2.0.0 + webpack 的解决方法。

首先,您需要通过 npm 或类似工具安装上述^包。

然后 --> npm install imports-loader

(对于在组件内使用 owl,否则你会得到 function is undefined。因为第三方模块依赖全局变量,如 $ 或 this 是窗口对象。)。

我正在使用 webpack,所以这部分是为 webpack 用户准备的:

导入加载器如下:

{test: /bootstrap\/dist\/js\/umd\//, loader: 'imports?jQuery=jquery'}

你也可以使用 jQuery 作为(webpack):

var ProvidePlugin = require('webpack/lib/ProvidePlugin');

作为插件使用:

plugins: [
new webpack.ProvidePlugin({
jQuery: 'jquery',
$: 'jquery',
jquery: 'jquery',
'window.jQuery': 'jquery'
})
]

对于图像加载器:

{
test: /\.(png|jpe?g|gif|ico)$/,
loader: 'file?name=public/img/[name].[hash].[ext]'
}

*public/img -- 图片文件夹

CSS 加载器:

{
test: /\.css$/,
include: helpers.root('src', 'app'),
loader: 'raw'
}

vendors.js 文件应导入以下内容:

import 'jquery';
import 'owl.carousel';
import 'owl.carousel/dist/assets/owl.carousel.min.css';

请注意 owl.carousel 2 仍在使用 andSelf() 已弃用的 jQuery 函数,因此我们需要用新版本的 addBack() 替换它们。

转到 owl 包 dist/owl.carousel.js 中的 node_modules 文件夹:用 --> addBack() 替换所有出现的 andSelf()。

现在是 Angular 2 部分:

owl-carousel.ts:

import {Component} from '@angular/core';

@Component({
selector: 'carousel',
templateUrl: 'carousel.component.html',
styleUrls: ['carousel.css']
})
export class Carousel {
images: Array<string> = new Array(10);
baseUrl: string = './../../../../public/img/650x350/';
}

carousel.component.ts:

import { Component, Input, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';

@Component({
selector: 'owl-carousel',
template: `<ng-content></ng-content>`
})
export class OwlCarousel implements OnDestroy, AfterViewInit{
@Input() options: Object;

$owlElement: any;

defaultOptions: Object = {};

constructor(private el: ElementRef) {}

ngAfterViewInit() {
for (var key in this.options) {
this.defaultOptions[key] = this.options[key];
}
var temp :any;
temp = $(this.el.nativeElement);

this.$owlElement = temp.owlCarousel(this.defaultOptions);
}

ngOnDestroy() {
this.$owlElement.data('owlCarousel').destroy();
this.$owlElement = null;
}
}

carousel.component.html:

<owl-carousel class="owl-carousel"[options]="{navigation: true, pagination: true, rewindNav : true, items:2, autoplayHoverPause: true, URLhashListener:true}">
<div class="owl-stage" *ngFor="let img of images; let i=index">
<div class="owl-item">
<a href="#"><img src="{{baseUrl}}{{i+1}}.png"/></a>
</div>
</div>
</owl-carousel>

确保引导 app.module 中的所有内容:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import {OwlCarousel} from './components/carousel/carousel.component';
import {Carousel} from './components/carousel/owl-carousel';


@NgModule({
imports: [
BrowserModule,
NgbModule,
],
declarations: [
AppComponent,
OwlCarousel,
Carousel
],
providers: [appRoutingProviders],
bootstrap: [ AppComponent ]
})
export class AppModule { }

现在您可以在 template/templateUrl 部分中的整个应用程序中使用指令/组件,无需导入任何内容。

请按照上述步骤操作,因为所有步骤都是完成 Angular 2.0.0 最终版本和 owl.carousel 2.1.4 版本之间集成所必需的。

关于angular - 如何在 Angular2 中使用 owl-carousel 异步更改 ng-content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38206810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com