Angular 推送使用角度2 ts时未定义值

Angular 推送使用角度2 ts时未定义值,angular,Angular,在推送之前,我可以在console.log结果中获取“sm”, 但是在尝试推的时候没有定义 chooseMenu(menu:Menuitems){ const sm = {name:menu.name,quantity:1,price:menu.product[('price')]} console.log("item add",sm); this.choosenMenu.push(sm); } “价格”未定义,请引导,以便我可以推送“sm” 这里是数据响应菜单:菜单项 { "data

在推送之前,我可以在console.log结果中获取“sm”, 但是在尝试推的时候没有定义

chooseMenu(menu:Menuitems){
const sm = {name:menu.name,quantity:1,price:menu.product[('price')]}
console.log("item add",sm);
this.choosenMenu.push(sm); 
}
“价格”未定义,请引导,以便我可以推送“sm”

这里是数据响应菜单:菜单项

 {
  "data": {
    "items": [
      {
        "id": 15,
        "name": "Canadian Wrap",
        "product": {
          "price": 6.99
        }
      },
      {
        "id": 12,
        "name": "Chicken Caesar Wrap",
        "product": {
          "price": 5.75
        }
      },
和“sm”的结果控制台日志

name:"Caramel Sundae"
 price:2.99
 quantity:1
我没有办法做这件事

menu.product.price

如何确保“价格”不被定义,这样我就可以推动它,
谢谢

请尝试
菜单.产品[('price')]
菜单.产品['price]
,而不是
菜单.产品[('price')]

如果您的价格一开始是
未定义的
,那么在您的对象中也将是
未定义的
。也许价格将在程序后面的对象中定义,因此
console.log()
显示价格(类似于)

编辑:在获得更多信息后,您似乎收到的是字符串而不是对象。在访问变量之前,必须确保该项是一个对象。您应该使用
JSON.parse(yourString)
将其转换为对象

chooseMenu(menu:Menuitems){
 if(typeof menu == "string") menu = JSON.parse(menu); // preferably do this when initializing menu.
 const sm = {name:menu.name,quantity:1,price:menu.product.price}
 console.log("item add",sm);
 this.choosenMenu.push(sm); 
}
此外,我还将
Menuitems
的对象类型更改为
Menu
可读性。不清楚
菜单
-对象是否为列表 或者不是。如果它是一个列表,我会将类型更改为
Array
,然后相应地更改方法


查看评论和您的错误消息,即:

如果使用menu.product.price,则错误为:“类型字符串上不存在属性‘price’”,如果使用menu.product[“price”]则错误为:“无法读取未定义的属性‘price”

它看起来确实像你在处理一个字符串。因此,John在这里使用JSON.parse是正确的。但是,如果您处理的是字符串,您实际上无法在对其进行字符串化之前直接解析它,因此只需执行以下操作:

chooseMenu(menu:Menuitems){
 if(typeof menu == "string") {
   menu = JSON.stringify(menu) // this first, then you can parse it!
   menu = JSON.parse(menu) // then parse it...
 }
 const sm = {name:menu.name,quantity:1,price:menu.product.price}
 console.log("item add",sm);
 this.choosenMenu.push(sm); 
}

感谢您在向导@AJT_82和John的帮助下解决此问题,我仍然无法清楚地了解绑定angular 2的这两种方式,这里是我所做的解决代码:

chooseMenu(menu:Menuitems){
 if(typeof menu.product == "string") {
   menu.product = JSON.stringify(menu.product) // this first, then you can parse it!
   menu.product = JSON.parse(menu.product) // then parse it...
 }
 const sm = {name:menu.name,quantity:1,price:menu.product[('price')]}
 console.log("item add",sm);
 this.choosenMenu.push(sm); 
}
对于我来说,只有menu.product需要字符串化、解析和

price:menu.product[('price')]

仍然需要我认为angular 2 ways

可能重复的您可以向我们提供您收到的错误消息吗?我无法键入menu.product.price或menu.product[0]。price不可访问您不可访问是什么意思?您的IDE中有一个错误,说它不可访问?如果我使用menu.product.price,则错误为:“type string上不存在属性‘price’”,如果使用menu.product[“price”]则错误为:“无法读取未定义的属性‘price’”,我还尝试JSON解析和JSON stringfy,就像您提供的链接一样,结果仍然相同如果是字符串,则应该执行
JSON.parse()
而不是
JSON.stringify()
,然后尝试访问属性。
price:menu.product[('price')]