2014-10-03 2 views
0

Попытка выставить экспресс здесь. Я использую модуль экспресс-сессии, и у меня не было проблем, когда я использую переменные сеанса, которые являются объектами или строками. Тем не менее, я просто не могу заставить массивы работать. Я использую технику корзины в качестве лабораторной крысы. Вот код, который вызывает у меня проблемы:Препятствованные переменные экспресс-сессии в виде массива

router.post('/', function(req, res) { 
    if (req.body.action == 'Add to Cart') { 
     var cart = req.session.cart = [];  
     cart.push(req.body.itemId); 
     res.redirect('/'); 
    } 
}); 

router.get('/', function(req, res) { 
     if (req.session.cart) { 
      var itemsInCart = req.session.cart.length; 
     } 
     res.render('index', { 
      title: 'Shopping Spree', 
      itemsInCart: itemsInCart, 
      products: [ 
       {id: 1, item: 'Boeing 747', price: 4500}, 
       {id: 2, item: 'Luxury Yacht', price: 200}, 
       {id: 3, item: 'Mercedes AMG GT', price: 15000}, 
       {id: 4, item: 'Apple iPhone 6', price: 2400}, 
       {id: 5, item: 'Moet Hennessey', price: 5000} 
      ] 

     }); 
    }); 

И в представлении: index.jade:

extends layout 
block content 
    h2= title 
    p Cart(#{itemsInCart} items) 
     a(href="/cart") [VIEW CART] 

    table 
     thead 
      tr 
       th Item 
       th Price 
      tr 
     tbody 
     - for (var i in products) { 
      tr 
       td= products[i].item 
       td= products[i].price 
       td 
        form(action="/", method="post") 
         input(type="hidden", name="itemId" value="#{products[i].id}") 
         input(type="submit", name="action", value="Add to Cart") 
     - } 

Первый раз на кнопку «Добавить в корзину» щелкают, itemsInCart действительно обновлен до 1. После Клики «Добавить в корзину» не будут обновлять это значение.

Просьба сообщить.

ответ

2

Используя эту линию

var cart = req.session.cart = []; 

каждый раз, когда вы звоните, вы переопределять содержание req.session.cart в [].

Попробуйте вместо этого:

var cart = req.session.cart || []; 

Это сохранит существующие значения cart и вы не потеряет предыдущих пункты

UPDATE

Что касается обновленного вопроса, вот что вы можете сделать , чтобы сохранить привязки Jade:

var pageScope; 

router.post('/', function (req, res) { 
    if (req.body.action == 'Add to Cart') { 
     var cart = req.session.cart = []; 
     cart.push(req.body.itemId); 
     pageScope.itemsInCart = req.session.cart && req.session.cart; 
     res.redirect('/'); 
    } 
}); 

router.get('/', function (req, res) { 
    pageScope.itemsInCart = req.session.cart && req.session.cart; 
    res.render('index', pageScope = { 
     //... 
    }); 
}); 

Идея заключается в обновлении itemsInCart, каждый раз, вы увеличиваете длину массива cart.

+0

Это, похоже, не работает. Я пробовал это, itemsInCart остается в 0 и не будет обновляться. – Duos

+0

Это означает, что часть кода, которая отвечает за обновление, не запускается после добавления элемента, пожалуйста, сообщите подробнее, где определена эта переменная itemsInCart? – jevgenig

+0

Я отредактировал свой вопрос, добавив все соответствующие коды. Пожалуйста, проверьте это. – Duos

0

Ну, после многих, многих итераций, я, наконец, получил его на работу:

router.get('/', function(req, res) { 
    if (req.session.cart) { 
     var itemsInCart = req.session.cart.length; 
    } else { 
     req.session.cart = []; 
    } 
    res.render('index', { 
     title: 'Shopping Spree', 
     itemsInCart: itemsInCart, 
     //... 
    }); 
}); 

затем

router.post('/', function(req, res) { 
    if (req.body.action == 'Add to Cart') { 
     req.session.cart.push(req.body.itemId); 
     res.redirect('/'); 
    } 
}); 

Я просто не знаю, почему я не подумал об этом раньше. Должно быть, это один из моих плохих дней.

Смежные вопросы