我有一个angular 6应用程序,有一个侧边栏组件
sidebar.ts
ngOnInit() {
if (!Array.isArray(this.menu) || !this.menu.length) {
const data = JSON.parse(localStorage.getItem('data'));
this.item = data.response;
for (let i = 0; i < this.item.menu.length; i++) {
if (this.item.menu[i] && this.item.menu[i].section === 'left_menu') {
if (this.menu.indexOf(this.item.menu[i].id) === -1) {
this.menu.push(this.item.menu[i]);
}
}
}
console.log(data.response); // this is getting called twice
}
}
sidebar.html
<ul class="sidenav">
<span *ngFor="let item of menu">
<li id="{{item.id}}">
<a href="{{item.menu_url}}">
<i class="{{item.class_name}}"></i>
<span>{{item.title}}</span>
</a>
</li>
</span>
<li>
<a class="nav-link" (click)="goTo(logout)">
<i class="fa fa-sign-out" aria-hidden="true"></i>
<span>Log Out</span>
</a>
</li>
</ul>
app.html
<app-left-sidebar *ngIf="showMenu"></app-left-sidebar>
<router-outlet></router-outlet>
和app.ts
constructor(private router: Router) {
const login = JSON.parse(localStorage.getItem('login'));
if (login !== undefined && login === true) {
if (location.pathname === '/login') {
this.router.navigate(['']);
this.showMenu = false;
} else {
this.showMenu = true;
}
} else {
if (location.pathname === '/login') {
this.showMenu = false;
} else {
this.showMenu = true;
}
}
}
我有两个问题
app.ts
上一次被调用,在sidebar.ts
上一次被调用了吗?console.log显示两个请求都来自侧边栏,同一行被调用两次。
答案 0 :(得分:1)
能否请您通过stackblitz共享代码。您可以设置this.menu = [];在ngOnInit()中的forloop之前。
ngOnInit() {
if (!Array.isArray(this.menu) || !this.menu.length) {
const data = JSON.parse(localStorage.getItem('data'));
this.item = data.response;
this.menu = [];
for (let i = 0; i < this.item.menu.length; i++) {
if (this.item.menu[i] && this.item.menu[i].section === 'left_menu') {
if (this.menu.indexOf(this.item.menu[i].id) === -1) {
this.menu.push(this.item.menu[i]);
}
}
}
console.log(data.response); // this is getting called twice
}
}
答案 1 :(得分:1)
如果console.log被调用两次,则意味着ngOnInit被称为twicw,只有当组件ID初始化两次或可能是从2个不同的地方调用该组件时,才可能发生,或者请检查您是否在做同样的事情ngOnChanges中的操作