2017-01-04 5 views
0

Я вижу странное поведение, когда массив, являющийся свойством объекта, появляется при заходе на консоль (и используется в других местах), но когда родительский объект регистрируется, он показывает свойство как пустое. Когда этот родительский объект возвращается вызывающей функции, свойство остается пустым.Свойство типа машинописного текста имеет данные, родительский объект показывает то же свойство, что и пустое

Вот класс 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; 
    } 
} 

screenshot of app and console log

+0

Примечание. Это часть приложения Angular 2. Я не думаю, что это имеет значение здесь. – dcoli

+0

Я думаю, что это на самом деле ошибка в Chrome. Это просто консоль, это странно. Я обнаружил, что проблема с моим приложением была связана с чем-то другим, но это скрывалось этой плохой информацией об отладке. – dcoli

ответ

0

Я думаю, что это на самом деле ошибка в Chrome. Это просто консоль, это странно. Я обнаружил, что проблема с моим приложением была связана с чем-то другим, но это скрывалось этой плохой информацией об отладке.

+0

Наведите указатель мыши на «i» рядом с меню. Это не ошибка, это неправильное понимание того, что происходит с этой стрелкой. –

+0

Спасибо. Я просто налил в консольные документы Chrome, и нет никакого упоминания о том, что именно показано при нажатии этой стрелки. Немного о том, что вы можете получить его, чтобы показать его в xml и т. Д., Но ничего о том, когда этот объект вычисляется. И почему вычисление этого позже означает, что массивы пустые? Если массивы были пусты, приложение будет обновлено до этих эффектов, а это не так. – dcoli

+0

Я предлагаю записывать что-то вроде 'JSON.stringify (m)' (если нет круглых ссылок); это даст вам структуру объекта, как это было при возникновении журнала. Я не задумывался о том, почему возникла ваша проблема, просто хотел дать вам понять, что начальный журнал и значения в объекте не синхронизированы. –