无限分配TypeType内存吗?

时间:2018-07-19 08:46:39

标签: javascript typescript typescript2.0

我具有用于存储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;
}

一切正常!

1 个答案:

答案 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”的所有操作在您的方法中都是纯本地的。

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

热烈的问候