2017-08-29 234 views
2

我正试图在Angular2中实现addtoCart函数。 我使用typescript类来表示一个LineItem,它表示产品以及数量和总价格(数量*产品价格)。数组findIndex()函数 - 无法读取未定义的属性'id'

export interface Product { 
    id?: number; 
    name?: string; 
    price?: number; 
} 

线项目:

export class LineItem { 
    product: Product; 
    quantity: number; 
    totalPrice: number; 
} 

的行项目阵:

lineItems: LineItem[]; 

在添加到购物车功能,我要检查,如果该项目已被添加,如果是的话只要找到该订单项对应产品并更新该特定订单项。

我选择的方法是: - 找到索引。 - 如果它大于-1,则添加新的订单项。 - 否则编辑订单项。

的问题是:当我试图找到该指数就说明这个错误

Cannot read property 'id' of undefined 

代码:

addProductToCart(product: any, quantity: number) { 
    const lineItem: LineItem = Object.assign({}, product); 
    lineItem.quantity = quantity; 
    lineItem.totalPrice = product.price * quantity; 
    const index = this.lineItems.findIndex((item) => { 
     return item.product.id === product.id 
    }); 
    if(index > -1) { 
     // edit the current item . 
     this.lineItems[index].quantity = quantity; 
     this.lineItems[index].totalPrice = quantity * product.price; 

    }else { 
     this.lineItems.push(lineItem); 
    } 
    } 

在第一次通话中没有错误,第二个电话会抛出错误。 这就是问题所在行:

const index = this.lineItems.findIndex((item) => { 
     return item.product.id === product.id 
    }); 

item.product.id抛出:无法读取的未定义的属性“身份证”。

它与打字稿类或接口或任何逻辑错误。

+0

你确定它不是'产品.id'这是扔?这是在同一条线上。你记录了'item','item.product'和'product'的值,看看里面有什么?这似乎是在调试时首先要尝试的。我们没有任何数据,所以很难说。 – spanky

+0

在控制台中记录您的lineItems并查看您到达的位置。 – Faisal

回答

-1
const lineItem: LineItem = Object.assign({}, product); 

此行的结果作为一个普通的对象:

lineItem = {ProductID: 1, ProductName: "Chai", UnitPrice: 18, quantity: 2} 

所以没有item.product.id对象链的简单的纯对象

PLUNKER

+0

lineItem是'LineItem'的类型,而不是'Product'。并且产品不是数组,所以这基本上是错误的:'this.lineItems.product.push(lineItem);' – Faisal

+0

查看更新的plunk –

相关问题