无限分配内存 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" 的所有操作在您的方法中都是纯本地的。

也许这有助于解决您的记忆问题

热烈的问候