【问题标题】:Storing Objects inside Object in Arrays in Angular 2在Angular 2中将对象存储在数组中的对象中
【发布时间】:2017-06-27 05:25:22
【问题描述】:

我正在尝试存储这些数据,这些数据来自 Wordpress 后端,在 Ionic 2 (Angular 2) 中使用 HTTP 获取请求。

我正在接收这个数据结构,

数据响应的控制台日志-

我正在尝试将这些数据存储在菜单数组中,例如菜单数组中的菜单(menu_1 和 menu_2)、类别数组中的类别、菜肴数组中的菜肴...

我该怎么做?

我不想使用管道进行展示或迭代,我只想存储在数组中以便更轻松地使用它们。

我现在的代码是这样的:

home.ts:

我有一个可注入类 (Globals) 来调用 http get,但我在 home.ts 组件的 getMenus 函数中进行了订阅:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { Globals } from '../../providers/globals';

@Component({
  selector: 'page-home',
  providers: [Globals],
  templateUrl: 'home.html'
})
export class HomePage {
  menus: any;

  constructor(public navCtrl: NavController, public globals: Globals) {
    this.getMenus();
  }

  getMenus() {
    this.globals.getMenus().subscribe(
      data => {
        console.log(data);
        this.menus = data;
      },
      err => { console.log(err) }
    );
  }
}

而且我已经创建了一个类,叫Menu,目前很简单:

import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';

@Injectable()
export class Menu {
  name: any;
  categories: any;

  constructor() {
    this.name = this.name;
    this.categories = this.categories;
  }
}

其中name是对象的基本字段(键:名称,值:“今天的菜单”,类别是cat_1,cat_2(menu_1对象内的两个对象,每个对象包含更多对象(dish_1,dish_2...)。

我的想法是为它们中的每一个创建一个类,Menu 类、Category 类和 Dish 类。但是我知道如何开始将这些对象存储在此类中。 :S

您好!

【问题讨论】:

  • “我正在尝试存储这些数据” - 尝试如何?将您拥有的代码添加到您的问题中
  • 我尝试了很多东西,但都没有奏效。也许说“我想要”而不是“我正在尝试”更正确......
  • 因此,您应该在问题中包含您尝试过的内容。您应该包含您拥有的代码,以及任何其他可以让您的问题更容易回答的内容。
  • Nitzan,我添加了我的代码,感谢您的建议!

标签: json angular typescript ionic2 javascript-objects


【解决方案1】:

你想做什么?

我认为您要做的是规范化您的数据。

(你在使用 Redux 模式吗?也许是 Ngrx ?如果是这样,这是一个标准化的好主意!)

这是标准化状态的样子:http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html

你应该怎么做?

您可以手动完成,如果您有许多其他请求要处理,这将变得相当困难,或者您可以在schema 中描述您的数据并使用normalizr 来完成这项工作(规范化数据)你。

【讨论】:

    【解决方案2】:

    如果您不知道从哪里开始。你可以试试这个方法。首先,创建一个模型:

    export class DummyModel {
     menu: any;
     cat: any;
     dish: any;
     ...
    //you can replace any with the type expected (string, number, etc)
    }
    

    在您的组件中,您导入 dummyModel 并设置数据

    import { DummyModel }                from '../dummy.model';
    /...
    dummyModel: DummyModel = dummyData;
    

    另外,请考虑@Nitzan Tomer 的建议,尝试编写您的代码,如果您遇到问题,这里的人可以提供帮助

    【讨论】:

    • 是的。这或多或少是我想要的。数据返回一个包含其他对象的对象,在“菜单”类中,我只想将字段“名称”保存在名称变量和类别中(但只有键,即名称:“cat_1”和“cat_2” ,因为该值是包含菜肴的整个对象)。我不知道我是否解释得很好,如果我的疑问很混乱,对不起。
    【解决方案3】:

    首先要做的是为您从服务器接收的数据创建一个接口,例如:

    interface Dish {
          Name: string;
          Description: string;
          Thumbnail: string;
    }
    
    interface Category {
          [name: string]: Dish;
    }
    
    type ServerResponse = {
          [name: string]: { [name: string]: Category; } & { name: string };
    }
    

    如果您想根据这些数据创建类,您可以:

    class Menu {
          name: string;
          categories: { [name: string]: Category };
    
          constructor(data: { [name: string]: Category; } & { name: string }) {
                this.name = data.name;
                this.categories = {};
    
                Object.keys(data).forEach(name => {
                      if (name !== "name") {
                            this.categories[name] = new Category(data[name]);
                      }
                });
          }
    }
    
    (data: ServerResponse) => {
          this.menus = {};
          Object.keys(data).forEach(name => {
                this.menus[name] = new Menu(data[name]);
          });
    }
    

    您还应该创建 Category 类等等,但这就是想法。

    【讨论】:

    • 不错的答案!我是 Typescript 的新手,但我正在尝试这样做。还有一个问题......我如何在打字稿中实现这一点?类型 ServerResponse = { [名称:字符串]:{ [名称:字符串]:类别; } & { 名称:字符串 }; Ionic 2 向我抛出这个错误:“一个类只能实现另一个类或接口。”
    • 您尝试做什么会导致该错误?编译器本身就可以使用该行,您是否要扩展ServerResponse
    • 是的,现在我已经使用这三个接口创建了 Menu、Category、Dish 类和文件 data-services.ts,我正在尝试在我有订阅的类中实现 ServerResponse到http请求。这不正确吗?
    • 不需要实现ServerResponse,或者我发布的任何其他接口,您从服务器接收到的json数据对象已经与这些接口匹配,您只需转换为。
    • 您好 Nitzan,很抱歉我的回复晚了,我一直在尝试您的方法,但它对我不起作用,可能是因为我的经验不足。我现在创建了类结构,但我不知道如何将 json 存储到他各自的类中(菜单中的菜单,类别中的类别......) getMenus(): any { return this.http.get(this. rul) .map(res => res.json()) .map(res => 反序列化(Menu, res));我正在使用 serializer.ts (npmjs.com/package/serializer.ts) 反序列化数据。那是对的吗?问候。
    猜你喜欢
    • 2011-11-11
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多