开发者问题收集

Js 购物车;localStorage 将我的购物车设置为空

2017-01-09
1036

我正在尝试创建一个基本的购物车以进行练习,但遇到了这个错误:

Uncaught TypeError: Cannot read property 'push' of null.

错误本身很明显,我只是不知道如何从逻辑上去修复它。

它发生在我的 addItem() 函数中,如下所示:

//adds items to the cart
    function addItem(name, price, quantity) {
        /*checks to see if the item with the identical name exists in the cart
        if so, it will only increment the quantity of the said item (no redundancies)*/
        for (var i in cartShop) {
            if(cartShop[i].name === name) {
                cartShop[i].quantity += quantity;
                saveLocalCart();
                return;
            };
        };
       var item = new Item(name, price, quantity);
        cartShop.push(item);
        saveLocalCart();
    };

然后在代码中进一步向下,我调用我的 loadLocalCart() 函数:

//a function for retrieving the cart state to the user
    function loadLocalCart() {
        //we use json.parse to return the stringified object back to a complex object.
        cartShop = JSON.parse(localStorage.getItem("cartSession"));
    };
    
    loadLocalCart();

此时,只有当我在 cartShop 数组中至少有一个项目对象时,它才能正常工作,但正如您所见,如果您刚刚启动会话,这个函数几乎将整个购物车设置为几乎为空。

当我尝试实现此功能时会触发此错误:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        //assigning a click event to DOM object
    $(".add-to-cart").click(function(event){
        //prevents the page from being refreshed
        event.preventDefault();
        //sets the name variable to a clicked data-name
        var name = $(this).attr("data-name");
        //sets the price to the number version of data-price attribute
        var price = Number($(this).attr("data-price"));
        
        addItem(name, price, 1);
        displayCart();
    });

我很感谢你们对如何处理这个问题的意见。如果你们感兴趣的话,我正在关注 这个 视频指南播放列表。

2个回答

只需确保 cartShop 在加载时不为空,如果为空,则将其设为空数组

function loadLocalCart() {
    //we use json.parse to return the stringified object back to a complex object.
    cartShop = JSON.parse(localStorage.getItem("cartSession"));
    if(!cartShop) cartShop = [];
};

另外,不要对数组使用 for...in 循环,因为它可能会迭代非数组元素的键。您可以改用 for...of 或普通 for 循环

for(let item of cartShop) {
    if(item.name === name) {
        item.quantity += quantity;
        saveLocalCart();
        return;
    };
}
Patrick Evans
2017-01-09

您可以尝试将以下内容添加为 addItem 方法的第一行。

cartShop = cartShop || [];

如果声明了 cartShop,此代码将“cartShop”声明为等于“cartShop”,否则它将等于一个新数组。

您也可以在 loadLocalCart 方法中使用它:

cartShop = JSON.parse(localStorage.getItem("cartSession")) || [];

但此问题可能是由变量的范围引起的,您可能需要调查一下。

jaxwilko
2017-01-09