2017-02-17 3 views
0

У меня есть проект модели данных в Angular 2. У меня есть только три класса.Получить метод Object в Object Angular 2

class Menu { 
    name: string; 
    categories: { [name: string]: Category }; 
} 

class Category { 
    name: string; 
    dishes: { [name: string]: Dish }; 
} 

class Dish { 
    name: string; 
} 

В каждом классе у меня есть два метода.

getName(){ return this.name } // во всех классах

и

getCategory() { return this.categories } // в случае класса меню

getDishes() { return this.dishes } // в случае класса Категория

В моем home.ts компонентов, У меня есть запрос данных (http-запрос) из бэкэнд, и я поместил все данные в эти классы. Это работает нормально.

getMenus() { 
    this.globals.getMenus().subscribe(
     data => { 
     this.menus = {}; 
     Object.keys(data).forEach(name => { 
      this.menus[name] = new Menu(data[name]); 
     }); 

     console.log(this.menus); 
     }, 
     err => { console.log(err) } 
    ); 
    } 

console.log (this.menus) работает нормально и корректно печатает всю модель данных.

Теперь мой вопрос:

Как я могу использовать методы GET, чтобы сделать список в моем home.html со всеми данными, например:

  • Menu 1
  • "name of menu"
  • Category 1
  • "name of category"

    • Dish 1
      • "name of dish 1"
  • Category 2
  • "name of category 2"

    • Dish 1
      • "name of dish 1"
  • Menu 2

  • "name of menu 2
    • Category 1
    • ... etc

Это ответ сервера Json:

{ 
    "menu_1": { 
    "name": "Menú de día", 
    "cat_1": { 
     "name": "Entrantes", 
     "dish_1": { 
     "Name": "Ensalada Romana" 
     }, 
     "dish_2": { 
     "Name": "Sopa de galets" 
     } 
    }, 
    "cat_2": { 
     "name": "Segundos", 
     "dish_1": { 
     "Name": "Calamares a la romana" 
     }, 
     "dish_2": { 
     "Name": "Tortilla de patatas" 
     } 
    } 
    }, 
    "menu_2": { 
    "name": "Menú Principal", 
    "cat_1": { 
     "name": "Primer Plato", 
     "dish_1": { 
     "Name": "Ensalada Romana" 
     }, 
     "dish_2": { 
     "Name": "Sopa de galets" 
     } 
    }, 
    "cat_2": { 
     "name": "Segundo Plato", 
     "dish_1": { 
     "Name": "Calamares a la romana" 
     }, 
     "dish_2": { 
     "Name": "Tortilla de patatas" 
     } 
    }, 
    "cat_3": { 
     "name": "Postres", 
     "dish_1": { 
     "Name": "Crema Catalana" 
     } 
    } 
    } 
} 

Заранее спасибо.

ответ

1

Вы можете использовать массив в вы класс, чтобы сделать его более статически типизированным.

class Menu { 
    name: string; 
    categories: Array<Category>; // initialize it as applicable 
} 
class Category { 
    name: string; 
    dishes: Array<Dish>;// initialize it as applicable 
} 
class Dish { 
    name: string; 
} 

Компонент

Вы можете попробовать заполнить this.menus, который также будет сильно типизированных Array<Menu> // убедитесь, что код прописан для компиляции.

getMenus() { 
    this.globals.getMenus().subscribe(
     data => { 
     this.menus = new Array<Menu>(); 
     Object.keys(data).forEach(name => { 
      //Initialize and push items as per data structure. 
      this.menus.push(new Menu(data[name])); 
     }); 

     console.log(this.menus); 
     }, 
     err => { console.log(err) } 
    ); 
    } 

шаблон организовать следующее как сочетание маркированного и нумерованного списка.

<ul> 
    <li *ngFor="let menu of menus"> 
     {{ menu.name }} 
     <ul> 
      <li *ngFor="let category of menu.categories"> 
       {{ category.name }} 
       <ul> 
        <li *ngFor="let dish of category.dishes"> 
         {{ dish.name }} 
        </li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 
+0

Да! Это работает для меня: D спасибо –

+0

@Javier Если вы чувствуете, что это должен быть ответ, примите его, чтобы другие могли использовать, если нет, и вы сделали что-то лучшее сообщение здесь, это сделает хороший вклад сообщества :) – Ankesh

+0

Done @Ankesh;) –

0

Angular's *ngFor будет работать только с истребимыми объектами, а не с картами.

может выглядеть следующим образом, используя Pipe для преобразования карты в массивы:

<ul> 
    <li *ngFor="let m of menus | mapToArray"> 
     {{ m.name }} 
     <ul> 
      <li *ngFor="let c of m.categories | mapToArray"> 
       {{ c.name }} 
       <ul> 
        <li *ngFor="let d of c.dishes | mapToArray"> 
         {{ d.name }} 
        </li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

И Pipe:

@Pipe({ 
    name: 'mapToArray' 
}) 
export class MapToArrayPipe { 
    public transform(map: any): any[] { 
    if (!map) return []; 
    return Object.keys(map).map(k => map[k]); 
    } 
} 

демо: https://plnkr.co/edit/HzwRftZXWnDlCZWJwL0d?p=preview

+0

Это выглядит хорошо, но бросает мне ошибку: Ошибка в ./HomePage класса HomePage - вызванное: Не удается найти объект отличается поддержкой «[объект Object]» типа «объекта».NgFor поддерживает только привязку к Iterables, например массивы. –

+0

Я вижу, ваш 'menus' не является массивом, его объектом. Лучшим способом было бы изменить его на массив меню, а не на карту меню. :) – mxii

+0

Спасибо за ваш ответ, но если я это сделаю, в чем смысл сделать модель данных с данными, хранящимися в классах в Angular 2? :(И даже если я это сделаю, это тоже вызовет ошибку, потому что в меню есть объекты типа «Категория внутри». –