我具有用于存储Menu类的对象的自定义属性:
private menu: Menu[] = [];
class Menu
处:
export class Menu {
constructor(public url: string, public title: string, public submenu: Menu[], public role: string, public avaliable: boolean) {
}
}
在课堂服务MenuService
中,我填写了this.menu
:
this.menu = [
new Menu('/dashboard/p', 'menu_zavuc_1', null, 'Principal', true),
new Menu('/school/%school_id%/h/management', 'menu_zavuc_2', null, 'Principal', true),
new Menu('/school/%school_id%/h/planning', 'menu_zavuc_3', null, 'Principal', true)];
同一类MenuService
中还有另一种方法:
public getMenuItems(profile: MenuHeader): IMenuItem[] {
let arr: IMenuItem[] = [];
this.menu.filter(function (element: Menu) {
return element.role == profile.role();
});
let arrOut: IMenuItem[] = [];
for (let i = 0; i < arr.length; i++) {
let url = arr[i].url.replace('%school_id%', profile.organizationId().toString());
url = url.replace('%pupil_id%', profile.getId().toString());
arrOut.push({
url: arr[i].url,
title: arr[i].title,
role: arr[i].role
});
}
return arrOut;
}
从模板调用方法getMenuItems
:
<div *ngFor="let menu of menuService.getMenuHeaders()">
<div *ngFor="let item of menuService.getMenuItems(menu)"></div>
</div>
如您所见,它是循环循环的。
问题是当我调用方法getMenuItems()
时,它会调用无限的内存分配。
当我尝试将同一对象this.menu.filter()
重用于某些操作时,我认为原因在this.menu
中。每次this.menu
链接到以前的值时都可能发生。
也许要克隆this.menu
?
如果getmenuItems()
的注释正文仅写:console.log(profile.role());
可以正常工作
如果在以下位置重写功能
public getMenuItems(profile: MenuHeader): IMenuItem[] {
let list: IMenuItem[] = [];
let l = {
url: '',
title: 'sss',
role: 'sdadad'
};
let a = {
url: '',
title: 'sss',
role: 'sdadad'
};
list.push(l);
list.push(a);
return list;
}
一切正常!
答案 0 :(得分:2)
我不确定这是否可以解决您的内存问题,但是在我看来,代码中存在一些错误。
请注意,数组上的.filter
不会更改数组,只会返回已过滤的数组。
this.menu.filter(function (element: Menu) {
return element.role == profile.role();
});
另外,您正在遍历arr
,但该变量保持使用[]初始化。
那么,您是说以下意思吗?
let arr: IMenuItem[] = this.menu.filter(function (element: Menu) {
return element.role == profile.role();
});
您还真的要返回arr
吗?
看来您确实想返回arrOut
可以写成:
public getMenuItems(profile: MenuHeader): IMenuItem[] {
return this.menu
.filter( (element: Menu) => element.role == profile.role() )
.map( (element: Menu):MenuItem => {
return {
url: element.url,
title: element.title,
role: element.role
}
});
}
通过这种方式,您对“ this.menu”的所有操作在您的方法中都是纯本地的。
也许有助于解决您的记忆力问题
热烈的问候