如何在angular / typescript中初始化子json对象?

时间:2019-07-16 01:02:38

标签: angular typescript angular-services

我有一个model.ts文件。

export class MainClass {
    someVar: string;
    var2: string;
    subClass: SubClass;
    contact: ContactList;
}

export class SubClass {
  subItem: {
    item1: string;
    item2: string;
    item3: string;
  }
  constructor() {}
}


export class ContactList {
  itemList: ListItems[];
  constructor() {}
}


export class ListItems {
  list1: string;
  list2: string;
  list3: string;  
}

我有一个service.ts文件,其中有我要更新模型的设置方法。

constructor(private model: SomeModel) {}

//some code

updateList(param1, param2, param3) {
    this.model.subClass.subItem.item1 = param1;//doesn't work
    this.model.contact.item[0].list1 = param2;//doesn't work
    this.model.someVar = param3;//works
}

它适用于单个变量,但是在尝试更新子类和联系人时出现错误Can't read property subItem of undefined。我知道我必须在模型的构造函数中初始化subItem和itemList,但无法弄清楚语法。如何初始化模型并更新模型?

4 个答案:

答案 0 :(得分:0)

请确保您要在MainClass中调用要初始化的复杂类型的构造函数。

export class MainClass {
    someVar: string;
    var2: string;
    subClass: SubClass();
    contact: ContactList();
}

请注意括号。如果您有更复杂的初始化,还有其他角度,我们也应该考虑,因为这里描述了几种情况。例如,在子类中,如果希望在启动子类的实例时也将其初始化,则应确保子项具有构造函数。

在父类中初始化subItem的另一种方法是在构造函数中执行以下操作:

 constructor() {
        //... some init code
        this.subItem = new Array<SubItemModel>();
        this.subItem.push(new SubItemModel());
    }

希望这会有所帮助,

答案 1 :(得分:0)

因为 subClass subItem 未定义。您必须在设置值之前为其创建新实例:

SomeModel 更改为 MainClass 或使用 .map 函数进行映射。

this.model.subClass = new SubClass();
this.model.subClass.subItem =  {item1:'123',item2: '222', item3: '333'};

答案 2 :(得分:0)

此错误的原因是subClass,subItem,联系人未定义。要解决此问题,请更改模型,如下所示

export class MainClass {
    someVar: string;
    var2: string;
    subClass: SubClass;
    contact: ContactList;
    constructor() {
      if(!this.subClass)
      this.subClass =new SubClass();
      if(!this.contact)
      this.contact =new ContactList();
    }
}

export class SubClass {
  subItem: SubItem;
  constructor() {
    if(!this.subItem)
     this.subItem =new SubItem();
  }
}
export class SubItem {

    item1: string;
    item2: string;
    item3: string;

  constructor() {}
}


export class ContactList {
  itemList: ListItems[]=[];
  constructor() {}
}
export class ListItems {
  list1: string;
  list2: string;
  list3: string;  
}

在使用中

constructor(private model: SomeModel) {}

//some code

updateList(param1, param2, param3) {
    this.model.subClass.subItem.item1 = param1;

 this.model.contact.itemList = [];
 let listItem: ListItems =new ListItems();
 listItem.list1 =param2
 this.model.contact.itemList.push(listItem)
    this.model.someVar = param3;
}

这可以帮助您理解错误,并且可以根据需要更改代码。希望这会有所帮助。

答案 3 :(得分:0)

我必须像这样在模型中初始化构造函数

export class MainClass {
  someVar: string;
  var2: string;
  subClass: SubClass;
  contact: ContactList;
  constructor() {
    this.subClass = new SubClass();
    this.contact = new ContactList();
  }
}

export class SubClass {
  subItemVar: SubItem;
  constructor() {
    this.subItemVar = new SubItem();
  }
}

export class SubItem {
  item1: string;
  item2: string;
  item3: string;
}

export class ContactList {
  itemList: ListItems[];
  constructor() {
    this.itemList = new Array<ListItems>();
  }
}

export class ListItems {
  list1: string;
  list2: string;
  list3: string;
}