簡體   English   中英

無限分配TypeScript內存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM