[英]Unlimited allocation of memory TypeScript?
我具有存儲菜單類的對象的自定義屬性:
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
用於某些操作時,原因在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
上的.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”的所有操作在您的方法中都是純本地的。
也許這有助於解決您的記憶力問題
溫暖的問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.