Я вижу странное поведение, когда массив, являющийся свойством объекта, появляется при заходе на консоль (и используется в других местах), но когда родительский объект регистрируется, он показывает свойство как пустое. Когда этот родительский объект возвращается вызывающей функции, свойство остается пустым.Свойство типа машинописного текста имеет данные, родительский объект показывает то же свойство, что и пустое
Вот класс Menu:
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. Я не думаю, что это имеет значение здесь. – dcoli
Я думаю, что это на самом деле ошибка в Chrome. Это просто консоль, это странно. Я обнаружил, что проблема с моим приложением была связана с чем-то другим, но это скрывалось этой плохой информацией об отладке. – dcoli