我有一个小问题:
错误:(SystemJS)超出最大调用堆栈大小(...)
我有一个组件,我导入另一个模块: 这是videos.module.ts:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { VideosComponent } from './videos.component';
import { EditorModule, SharedModule, ButtonModule } from 'primeng/primeng';
import { GalleryModule } from '../../components/gallery/gallery.module';
@NgModule({
imports: [CommonModule, SharedModule, EditorModule, SharedModule, ButtonModule, GalleryModule],
declarations: [VideosComponent],
exports: [VideosComponent],
providers: []
})
export class VideosModule { }
如您所见,我正在导入图库模块。如果我删除它,那么错误就会消失。 让我们继续沿着兔子洞走。
这是画廊gallery.module.ts:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { ViewerComponent } from '../viewer/viewer.component';
import { GalleryComponent } from './gallery.component';
@NgModule({
imports: [BrowserModule, FormsModule, HttpModule],
declarations: [GalleryComponent, ViewerComponent],
exports: [GalleryModule],
providers: []
})
export class GalleryModule { }
这是gallery.component.ts
import {Component, NgZone, ViewChild, ElementRef} from '@angular/core';
import {Http, Response} from '@angular/http';
import { ViewerComponent } from '../viewer/viewer.component';
import 'rxjs/Rx';
interface IImage {
url: string;
thumbnail: string;
date: string;
width: number;
height: number;
}
@Component({
selector: 'sd-gallery',
templateUrl: 'gallery.component.html',
styleUrls: ['gallery.component.css']
})
export class GalleryComponent {
@ViewChild('galleryContainer') galleryContainer: ElementRef;
@ViewChild('asyncLoadingContainer') asyncLoadingContainer: ElementRef;
thumbnailBasePath = 'assets/img/gallery/preview_xxs/';
currentIdx: number = 0;
galleryBasePath: string = 'assets/img/gallery/';
showBig: boolean = false;
images: any[] = [{ url: '' }];
gallery: any[] = [];
imgIterations = 1;
allImagesLoaded = false;
// TypeScript public modifiers
constructor( private _ngZone: NgZone, private http: Http ) {
}
private ngAfterContentInit() {
this.fetchDataAndRender();
}
private fetchDataAndRender() {
this.http.get(this.galleryBasePath + 'data.json')
.map((res: Response) => res.json())
.subscribe(
data => {
this.images = data;
this.render();
},
err => console.error(err),
() => undefined);
}
private render() {
let tempRow = [this.images[0]];
let rowIndex = 0;
let i = 0;
for (i; i < this.imgIterations && i < this.images.length; i++) {
while (this.images[i + 1] && this.shouldAddCandidate(tempRow, this.images[i + 1])) {
i++;
}
if (this.images[i + 1]) {
tempRow.pop();
}
this.gallery[rowIndex++] = tempRow;
tempRow = [this.images[i + 1]];
}
this.scaleGallery();
if (i >= this.images.length) {
this.allImagesLoaded = true;
} else {
this.checkForAsyncReload();
}
}
private shouldAddCandidate(imgRow: IImage[], candidate: IImage): boolean {
let oldDifference = this.calcIdealHeight() - this.calcRowHeight(imgRow);
imgRow.push(candidate);
let newDifference = this.calcIdealHeight() - this.calcRowHeight(imgRow);
return Math.abs(oldDifference) > Math.abs(newDifference);
}
private calcRowHeight(imgRow: IImage[]) {
let xsum = this.calcOriginalRowWidth(imgRow);
let ratio = this.getGalleryWidth() / xsum;
let rowHeight = imgRow[0].height * ratio;
return rowHeight;
}
private scaleGallery() {
this.gallery.forEach((imgRow) => {
let xsum = this.calcOriginalRowWidth(imgRow);
if (imgRow !== this.gallery[this.gallery.length - 1]) {
let ratio = this.getGalleryWidth() / xsum;
imgRow.forEach((img: any) => {
img.width = img.width * ratio;
img.height = img.height * ratio;
})
}
})
}
private calcOriginalRowWidth(imgRow: IImage[]) {
let xsum = 0;
imgRow.forEach((img) => {
let individualRatio = this.calcIdealHeight() / img.height;
img.width = img.width * individualRatio;
img.height = this.calcIdealHeight();
xsum += img.width + 1;
});
return xsum;
}
private calcIdealHeight() {
return (this.getGalleryWidth() / 8) + 70;
}
private openImageViewer(img: any) {
this.showBig = undefined;
this.showBig = true;
this.currentIdx = this.images.indexOf(img);
}
private getGalleryWidth() {
if (this.galleryContainer.nativeElement.clientWidth === 0) {
// IE11
return this.galleryContainer.nativeElement.scrollWidth;
}
return this.galleryContainer.nativeElement.clientWidth;
}
private checkForAsyncReload() {
if (!this.allImagesLoaded) {
var loadingDiv: any = this.asyncLoadingContainer.nativeElement;
var elmTop = loadingDiv.getBoundingClientRect().top;
var elmBottom = loadingDiv.getBoundingClientRect().bottom;
var isVisible = (elmTop >= 0) && (elmBottom <= window.innerHeight);
if (isVisible) {
this.imgIterations += 5;
this.fetchDataAndRender();
}
}
}
private onClose() {
this.showBig = false;
}
private onResize() {
this.render();
}
}
我不会包含观众部分,因为即使我从画廊html /模块中删除它,我仍然会遇到同样的问题。
全部谢谢!
答案 0 :(得分:1)
我在GalleryModule
中看到两个错误,其中一个错误可能会导致您收到的错误。
<强>第一强>
只应在根模块中导入 BrowserModule
。 (最常见的是,这是AppModule
)您应该导入CommonModule
,因为GalleryModule
可能只需要这样做。 (CommonModule
包含常见指令,例如*ngIf
和*ngFor
)
<强>第二强>
从导出中删除GalleryModule
:
exports: [GalleryModule]
为什么要从GalleryModule
本身导出GalleryModule
?这条线已经完成了所有的工作:
export class GalleryModule { }
如果我不得不打赌,我会说这是造成错误的原因。
答案 1 :(得分:0)
当我收到此错误时,它是由我的网页上包含prototype.js库引起的。删除原型后,我的Angular 2应用程序成功加载。