2015-02-19 8 views
0

Я извлекаю продукты, выполняя следующие действия.Добавление дополнительных ключей к извлеченной коллекции

Template.Bag.helpers({ 
    bagged_products: function() { 
     var bag = Session.get("shoppingBag") || {}; 
     var bagged_product_ids = Object.keys(bag); 
     var bagged_products = Products.find({_id: {$in: bagged_product_ids}}); 
     return bagged_products; 
    } 
    }) 

Словарь bag представляет собой массив {"product_id": quantity}. В шаблоне я также хочу показать количество каждого продукта. Например, я хотел бы сделать

for each retrieved_product p: 
    p.qty = qty 
return updated_products 

Проблема заключается в том, что bagged_products является LocalCollection.Cursor типа, и я не знаю, как добавить свойство к этому, так что я могу сделать следующее в шаблоне.

 <div class="product-name">{{p_name}}</div> 
     <div class="product-price">${{price}}</div> 
     <div class="product-qty">{{my_added_qty}}</div> 

Спасибо!

ответ

1

Вы можете использовать преобразование в вашем помощнике:

var bag = Session.get("shoppingBag") || {} 

var transform = function(product) { 
    product.qty = bag[product._id] || 0; 
    return product; 
} 

return Products.find({_id: {$in: bagged_product_ids}}, {transform: transform}); 

Тогда просто использовать {{qty}} или что-нибудь еще, вы называете его в #each блоке, где вы использовали {{my_added_qty}}

+0

Я думаю, что это лучше, чем инициализация новой временной локальной коллекции, но я не мог понять, как пройти в 'qty' как параметр функции преобразования. Знаете ли вы, возможно ли это? –

+0

Я не уверен, что понимаю. Куда бы вы его взяли, чтобы передать его? Если у вас есть 'function (product, qty)' где бы он получил qty из ?. На данный момент с вашей временной коллекцией вы можете сделать это вместо 'product.qty = bag [product._id]' где 'var bag = Session.get (" shoppingBag ") || {} '(определяется вне преобразования, убедитесь, что вы не определяете это внутри преобразования, чтобы обеспечить его реактивность). – Akshat

+0

@MaximusS обновил ответ, чтобы показать это. – Akshat

0

В конце концов я объявляю новую местную коллекцию, прежде чем возвращать документы.

Template.Bag.helpers({ 
    bagged_products: function() { 
     var bag = Session.get("shoppingBag") || {}; 
     var tmpBag = new Mongo.Collection(null); 
     for (var p_id in bag) { 
     var p = Products.findOne({_id: p_id}); 
     p.qty = bag[p_id]; 
     tmpBag.insert(p); 
     } 
     return tmpBag.find(); 
    } 
    }) 
+0

вы проверили [это package?] (https://github.com/jeffmitchel/meteor-local-persist) – Ethaan

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