【问题标题】:typescript object property has data, parent object shows same property as empty打字稿对象属性有数据,父对象显示相同的属性为空
【发布时间】:2017-01-04 21:21:36
【问题描述】:

我看到一些奇怪的行为,当记录到控制台(并在其他地方使用)时,作为对象属性的数组出现填充,但是当记录父对象时,它显示该属性为空.当这个父对象返回给调用函数时,该属性保持为空。

这是菜单类:

import { MenuItem } from './menu-item';

export class Menu {
  category: string;
  label?: string;
  itemArray: MenuItem[] = [];
  displayArray: MenuItem[] = [];
  masterArray: MenuItem[] = [];
  singleChoice: boolean = false;
  isDisplaying: boolean = true;
  isCategory( s: string ) { return this.category = s; };
}

这里是 MenuItem 类(它可以以比这里显示的更复杂的方式使用):

import { Menu } from './menu';

export class MenuItem {
  label: string;
  value: string;
  children: MenuItem[] = [];
  parentMenu: Menu;
  isSelected: boolean = false;
  isCategory( s: string ) { return this.parentMenu.category = s; };
  hideFromMenu: boolean = false;
}

下面是一些构造这些对象的代码。请注意,当类别为“日期”并且项目的属性是硬编码时,itemArray 会自行填充,并在通过控制台中的父对象查看时填充。它失败的所有其他类别。

initializeMenu(category: string, categoryName: string): Menu {
  let m = new Menu();
  m.category = category;
  m.label = this.categoryNameArray[this.categoryArray.indexOf(category)]? this.categoryNameArray[this.categoryArray.indexOf(category)]: category;
  switch( category ) {
    case "date":
      let propArray = [
                        {label:"Today",value:"today",hideFromMenu:false},
                        {label:"Day",value:"day",hideFromMenu:true},
                        {label:"This Week",value:"this week",hideFromMenu:false},
                        {label:"Next Week",value:"next week",hideFromMenu:false},
                        {label:"This Month",value:"this month",hideFromMenu:false},
                        {label:"Month",value:"month",hideFromMenu:true}
                      ];
      for(let p of propArray) {
        let i: MenuItem = new MenuItem();
        i.label = p.label;
        i.value = p.value;
        i.hideFromMenu = p.hideFromMenu;
        i.parentMenu = m;
        m.itemArray.push(i);
        // if( ! p.hideFromMenu ) m.displayArray.push(i);
      }
      m.isDisplaying = false;
      m.singleChoice = true;
      m.displayArray = this.getDisplayableDates(m.itemArray);
      m.masterArray = m.itemArray;
      return m;
      // break;
    default:
      let categoryIDs = this.makeContentSet(this.getMenuItemIDs(this.contentItems,category));
      for(let id of categoryIDs){
        let mi = new MenuItem();
        mi.parentMenu = m;
        mi.label = id;
        mi.value = id;
        m.itemArray.push(mi);
      }
      m.displayArray = m.itemArray;
      // m.displayArray = m.itemArray.filter(function(i){return ! i.hideFromMenu});
      m.isDisplaying = false;
      m.singleChoice = false;
      m.masterArray = m.itemArray;
// THIS IS WHERE IT GETS WEIRD. THE FIRST LOG SHOWS A POPULATED 
// m.displayArray, THE SECOND LOG SHOW A PARENT OBJECT WITH POPULATED   
// VALUES FOR EACH ARRAY, THE THIRD LOG SHOWS EMPTY VALUES FOR THE ARRAYS
// IN m. WEIRDER, m SHOWS POPULATED ARRAYS WHEN COLLAPSED IN THE CONSOLE, 
// BUT EMPTY ONES WHEN EXPANDED. SEE SCREENSHOT.
      console.log(m.displayArray);
      console.log(Object.values(m));
      console.log(m);
      return m;
      // break;
  }
}

【问题讨论】:

  • 注意,这是 Angular 2 应用程序的一部分。不过,我认为这并不重要。
  • 我认为这实际上是 Chrome 中的一个错误。只是控制台很奇怪。我发现我的应用程序的问题是由其他原因引起的,但是这个错误的调试信息隐藏了这一点。

标签: javascript typescript javascript-objects


【解决方案1】:

我认为这实际上是 Chrome 中的一个错误。只是控制台很奇怪。我发现我的应用程序的问题是由其他原因引起的,但这个错误的调试信息隐藏了这一点。

【讨论】:

  • 将鼠标悬停在菜单旁边的i 上。这不是错误,而是对切换该箭头的作用的误解。
  • 谢谢。我刚刚浏览了 Chrome 控制台文档,并没有提及单击该箭头时所显示的确切内容。有一点关于你可以让它在 xml 等中显示它的事实,但没有关于何时计算该对象。为什么稍后计算它意味着数组是空的?如果数组为空,则应用程序将更新为这些效果,但事实并非如此。
  • 我建议记录类似JSON.stringify(m) 的内容(如果没有循环引用);这将为您提供日志发生时的对象结构。我没有调查您的问题发生的原因,只是想提醒您初始日志和对象中的值不同步。
猜你喜欢
  • 2017-09-13
  • 2018-12-31
  • 1970-01-01
  • 2019-10-03
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多