我尝试通过遵循官方教程(https://angular.io/tutorial/)学习语言,但是在按照英雄组件和英雄详细信息组件的步骤进行操作时,会引发错误“ RangeError:超出最大调用堆栈大小”。
hero.component.html和详细代码如下:
src = URL.createObjectURL(file);
Environment.setBackgroundImage(src, {format: format});
有关详细信息:
<ul class="heroes">
<li *ngFor="let hero of heroes" (click)="onSelect(hero)" [class.selected]="hero === selectedHero">
<span class="badge">{{hero.id}}</span> {{hero.name}}
</li>
</ul>
<!--
<app-hero-detail [hero]="selectedHero"></app-hero-detail> -->
<app-heroes></app-heroes>
英雄组件
<div *ngIf="hero">
<h2>{{hero.name}} Details</h2>
<div><span>id: </span>{{hero.id}}</div>
<div>
<label>name:
<input [(ngModel)]="hero.name" placeholder="name"/>
</label>
</div>
</div>
<app-hero-detail [hero]="selectedHero"></app-hero-detail>
hero.detail组件
import { Component, OnInit } from '@angular/core';
import { Hero } from '../hero';
import { HEROES } from '../mock-heroes';
import { HeroService } from '../hero.service';
@Component({
selector: 'app-heroes',
templateUrl: './heroes.component.html',
styleUrls: ['./heroes.component.css']
})
export class HeroesComponent implements OnInit {
heroes: Hero[];
selectedHero: Hero;
constructor(private heroService: HeroService) { }
ngOnInit() {
this.getHeroes();
}
getHeroes(): void {
this.heroes = this.heroService.getHeroes();
}
onSelect(hero: Hero): void {
this.selectedHero = hero;
}
}
要提及的一件事是,在对import { Component, OnInit, Input } from '@angular/core';
import { Hero } from '../hero';
@Component({
selector: 'app-hero-detail',
templateUrl: './hero-detail.component.html',
styleUrls: ['./hero-detail.component.css']
})
export class HeroDetailComponent implements OnInit {
@Input() hero: Hero;
constructor() { }
ngOnInit() {
}
}
进行注释时,将加载列表页面而不会出现错误
答案 0 :(得分:2)
1。存在无限循环时,会发生此错误。 正如您已经提到的,当对 app-heroes 进行评论时,页面会加载,该名称可能被用作多个组件的选择器名称,这是不允许的。 这可能会导致无限循环并无法加载组件。
hero.component.html
<ul class="heroes">
<li *ngFor="let hero of heroes" (click)="onSelect(hero)" [class.selected]="hero === selectedHero">
<span class="badge">{{hero.id}}</span> {{hero.name}}
</li>
</ul>
<app-hero-detail [hero]="selectedhero"></app-hero-detail>
hero.detail.component.html
<div *ngIf="hero">
<h2>{{hero.name}} Details</h2>
<div><span>id: </span>{{hero.id}}</div>
<div>
<label>name:
<input [(ngModel)]="hero.name" placeholder="name"/>
</label>
</div>
</div>
希望这会有所帮助。
答案 1 :(得分:2)
我将添加一个答案,描述在将现有应用程序升级到8号角并使用新的路由功能时导致此错误的不同原因。
对于我来说,我使用新的语法将data
对象设置为preload
的{{1}}对象添加到每个延迟加载的路由中:
true || false
但是我花了一段时间才意识到我已经在 {
path: '',
loadChildren: () => import('./views/home/home.module').then(mod => mod.HomeModule),
data: { preload: true }
},
forRoot声明中将preloadingStrategy
设置为PreloadAllModules
了:
RouterModule
从用于Root声明的模块中删除preloadingStrategy并依靠路由数据预加载definitio可以解决此问题。
答案 2 :(得分:2)
当升级到现有应用程序的angular 8并在单独的文件中使用新的路由功能时,导致此错误的另一种原因。
在我的情况下,未将featureRouterModule
导入其特定的featureModule.ts
会导致最大堆栈超出错误。由于angular找不到其已注册的特定路由器文件
答案 3 :(得分:2)
创建模块时,我能够重现此错误消息,而我忘记添加RoutingModule。
let conf = WKWebViewConfiguration()
let ctrl = WKUserContentController()
conf.userContentController = ctrl
let wkDataStore = WKWebsiteDataStore.nonPersistent()
wkDataStore.removeData(
ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(),
modifiedSince: .distantPast) { }
HTTPCookieStorage.shared
.cookies?
.forEach { wkDataStore.httpCookieStore.setCookie($0) }
conf.websiteDataStore = wkDataStore
wkWebView = WKWebView(frame: .zero, configuration: conf)
// ...
// Get URL from getAuthenticatedURL and load in wkWebView
我不知道为什么会出现此错误,但是也许另一个人也可能犯同样的错误。
答案 4 :(得分:2)
当我的智能感知不小心将模块名称(而不是特定的组件名称)添加到模块的导出中时,我正在处理此错误:
@NgModule({
declarations: [
FooComponent,
// ...
],
imports: [CommonModule],
exports: [
FooModule, // <== should be 'FooComponent'
// ...
],
})
export class FooModule {}
如果错误的描述性更强一点,那肯定会很好,因为我有一段时间用这个工具
答案 5 :(得分:1)
在您的示例中,您在自己内部渲染组件,因此您永远不会完成此操作,并且始终渲染另一个子组件(如果代码块的第二部分是
更新-更多详细信息:
如果您使用组件编写应用程序,则所有组件都是分层的,因此只有在确定内部循环数量有限的情况下,才能在您自己内部包含相同的组件。在您的代码示例中,您具有无限的嵌套组件,因为子组件会在您体内生成下一个子组件。结果您的浏览器显示错误:RangeError: Maximum call stack size exceeded
hero.component.html
<ul class="heroes">
<li *ngFor="let hero of heroes" (click)="onSelect(hero)" [class.selected]="hero === selectedHero">
<span class="badge">{{hero.id}}</span> {{hero.name}}
</li>
</ul>
<!--
<app-hero-detail [hero]="selectedHero"></app-hero-detail> -->
<app-heroes></app-heroes>
app-hero-details.component.html
<div *ngIf="hero">
<h2>{{hero.name}} Details</h2>
<div><span>id: </span>{{hero.id}}</div>
<div>
<label>name:
<input [(ngModel)]="hero.name" placeholder="name"/>
</label>
</div>
</div>
// you should comment line below
// <app-hero-detail [hero]="selectedHero"></app-hero-detail>
答案 6 :(得分:1)
您在详细信息HTML内显示了<app-hero-detail>
。
<app-hero-detail [hero]="selectedHero"></app-hero-detail>
请尝试删除它。 hero.component.html
中有类似的行被注释,您可以取消注释。
答案 7 :(得分:1)
当我在Angular 9上错误地使用圆形模块导入时,发生了此错误。
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
@NgModule({
imports: [
CommonModule,
ModuleTwo
],
})
export class ModuleOne {
}
和
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
@NgModule({
imports: [
CommonModule,
ModuleOne
],
})
export class ModuleTwo {
}
答案 8 :(得分:0)
我以类似的方式命名了两个模块,并且没有注意导入的模块。 如果您将模块导入其内部,则会导致循环导入,直到达到最大调用堆栈为止。
答案 9 :(得分:0)
我发现此错误的可能情况:
app.module.ts
文件中导入错误您可以尝试的解决方案: