Angular2幻灯片

Posted

技术标签:

【中文标题】Angular2幻灯片【英文标题】:Angular2 SliderShow 【发布时间】:2017-05-08 22:12:31 【问题描述】:

我想在 angular2 中构建滑块,但我遇到了很多麻烦。好的,让我们进入主要问题。为什么这个函数给我这个错误

"ERROR 错误:未捕获(承诺中):RangeError:超出最大调用堆栈大小 RangeError: 超出最大调用堆栈大小"

这是我的代码(我用 ViewChild 等尝试了很多东西,现在卡在这个问题上)。

import  Component, OnInit, AfterViewInit, Input, ViewChild  

from '@angular/core';

@Component(
    selector: 'slider',
    template: `
        <div class="slider-container">
            <header>
                <div class="slider-information">
                    <span class="slider-information--title" id="slidername">Acer C720-2103 Chromebook</span>
                    <span class="slider-information--category">
                        Category: <span id="slidercategory">Laptops</span>
                    </span>
                    <span class="slider-information--learnmore">
                        More about <span id="sliderinfoname">Acer C720-2103 Chromebook</span>
                    </span>
                </div>
                <div class="slider-image">
                    <img id="sliderimage" src="../../../images/slider/laptop-slider.jpg" >
                </div>
            </header>
        </div>
    `,
    styles: [`
        :host
            overflow: hidden;
        
    `]
)
export class SliderComponent implements OnInit, AfterViewInit  
    sliderCount: number = 0;
    images: any[];
    constructor()  
    ngOnInit() 
        this.images = this.createImages();
    
    ngAfterViewInit() 
        this.slider();
    
    slider(): void
        var slidername = document.getElementById('slidername');
        var sliderimage = document.getElementById('sliderimage');
        var sliderinfoname = document.getElementById('sliderinfoname');
        var slidercategory = document.getElementById('slidercategory');
        if(this.sliderCount > this.images.length - 1)
            this.sliderCount = 0;
        
        slidername.innerhtml = this.images[this.sliderCount].name;
        sliderimage.setAttribute('src', this.images[this.sliderCount].url);
        sliderinfoname.innerHTML = this.images[this.sliderCount].name;
        slidercategory.innerHTML = this.images[this.sliderCount].category;
        this.sliderCount += 1;
        debugger;
        setTimeout(this.slider(), 2000);
    
    createImages(): any[]
        var newImages: any[];
        newImages = [
             url: "../../../images/slider/laptop-slider.jpg", category: "Laptop" , name: "Acer C720-2103 Chromebook" ,
             url: "../../../images/slider/mobilephone-slider.jpg", category: "Phone", name: "Samsung Edge S6" 
        ]
        return newImages;
    

有什么问题?

更新

我改变了这个 setTimeout(this.slider(), 2000);setTimeout(this.slider, 2000);。它仅在第一次迭代中有效。在第二个我得到“错误类型错误:无法读取未定义的属性'长度'”

【问题讨论】:

让你的问题集中在你的错误信息上;你做了什么样的调试来找出你的堆栈溢出的原因? “我的解决方案好吗”对于 Stack Overflow 来说不是一个好问题,因为它太宽泛了,帖子应该是关于一个问题的,所以它们对其他人有用。 我正在调试以了解 text 和 src 是否已更改(是的,但仅在调试模式下)。 已经找到了解决办法,但是又犯了其他的bug:/(更新) 我建议您查看 angular 2 文档以了解如何使其更简单:angular.io/docs/ts/latest/guide/displaying-data.html 【参考方案1】:

你先打电话

this.slider() 来自 this.slider(),因为您调用它而不是传递对 this.slider 的引用,这会导致堆栈溢出。

现在您传递的引用没有正确绑定this。改成

setTimeout(() => this.slider(), 2000);

this.slider() 将在 2 秒后运行,this 设置正确。见How to access the correct `this` context inside a callback?

如果你打电话给document.getElementById(),你就没有像 Angular 那样做。您从 DOM 中挖掘出来的数据应该传递给您的组件,而不是将您的组件与环境紧密耦合。

【讨论】:

非常感谢。改变了这个丑陋的 getElementById :)

以上是关于Angular2幻灯片的主要内容,如果未能解决你的问题,请参考以下文章

测试使用 setInterval 或 setTimeout 的 Angular2 组件

第二个幻灯片等待第一个幻灯片完成

如何使用C#操作幻灯片

如何进入幻灯片配色方案 设置蓝色为背景配色方案 应用于所有幻灯片

PPT中,如何让图片自动填满整个幻灯片?

PPT幻灯片技巧