无限分配内存 TypeScript?
Unlimited allocation of memory TypeScript?
我有自定义 属性 存储 class 菜单的对象:
private menu: Menu[] = [];
其中 class Menu
:
export class Menu {
constructor(public url: string, public title: string, public submenu: Menu[], public role: string, public avaliable: boolean) {
}
}
在class服务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)];
同样还有一个方法class 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;
}
工作正常!
我不确定这是否会解决您的内存问题,但在我看来,代码中存在一些错误。
请注意,数组上的 .filter
不会更改数组,它只是 RETURNS 过滤后的数组。
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();
});
你也真的想 return arr
吗?
看来你很想returnarrOut
可以写成:
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" 的所有操作在您的方法中都是纯本地的。
也许这有助于解决您的记忆问题
热烈的问候
我有自定义 属性 存储 class 菜单的对象:
private menu: Menu[] = [];
其中 class Menu
:
export class Menu {
constructor(public url: string, public title: string, public submenu: Menu[], public role: string, public avaliable: boolean) {
}
}
在class服务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)];
同样还有一个方法class 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;
}
工作正常!
我不确定这是否会解决您的内存问题,但在我看来,代码中存在一些错误。
请注意,数组上的 .filter
不会更改数组,它只是 RETURNS 过滤后的数组。
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();
});
你也真的想 return arr
吗?
看来你很想returnarrOut
可以写成:
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" 的所有操作在您的方法中都是纯本地的。
也许这有助于解决您的记忆问题
热烈的问候