[英]Meteor Storing and Retrieving Custom Objects in Session
我创建了一个自定义购物车对象,并将其放在lib
文件夹中。
ShoppingCart = function ShoppingCart() {
this.Items = new Array();
this.grandTotal = 0.00;
}
ShoppingCart.prototype.addItem = function(Item){
this.Items.push(Item);
this.Items.sort();
this.calculateTotal();
}
我初始化了购物车,并在页面created
阶段将其存储为Session.set('shoppingCart')
。
Template.loginStatus.created = function() {
Session.set('loginShown',false);
if(!Session.get('shoppingCart')){ //set default if session shopping cart not exist
var cart = new ShoppingCart();
Session.setDefault('shoppingCart',cart);
}
然后,当用户单击将商品添加到购物车时,它将触发以下逻辑:
var cart = Session.get('shoppingCart');
cart.addItem(item);
Session.set('shoppingCart',cart);
不知何故,它不起作用。 当我在chrome控制台上看广告时,它说undefined is not a function
,指向cart.addItem(item)
行。 如果将其更改为此,它将起作用,但是当然,由于每次创建新的购物车时,我都无法在购物车中累积商品。
var cart = new ShoppingCart();
cart.addItem(item);
Session.set('shoppingCart',cart);
我应该如何正确地从会话中存储和检索对象? 它看起来像是从Session.get()返回的对象,以某种方式不视为ShoppingCart。 我想念任何类型的演员吗?
正如@Peppe LG提到的那样,您只能在会话中存储EJSON。 要存储您的自定义对象,您需要能够手动将其与EJSON相互转换。 例:
_.extend(ShoppingCart, {
fromJSON: function(json) {
var obj = new ShoppingCart();
obj.grandTotal = json.grandTotal;
obj.Items = json.Items;
return obj;
},
});
_.extend(ShoppingCart.prototype, {
toJSON: function() {
return {
grandTotal: this.grandTotal,
Items: this.Items,
};
},
});
然后,您可以将其保存到会话:
Session.set('shoppingCart', cart.toJSON());
并还原:
ShoppingCart.fromJSON(Session.get('shoppingCart'));
我遇到了同样的问题。 本质上,正在发生的流星会话(和集合)只能存储EJSON类型,因此,您从Shopping Session中检索到的ShoppingCart自定义类型是普通对象。
虽然您可以手动与EJSON进行相互转换,但最终可能需要在许多不同的地方重复进行此操作。 如果您的ShoppingCart是另一个对象的成员,则还必须手动转换该成员。 最好使用EJSON.addType告诉Meteor如何在您存储或检索该类型的对象的任何地方自动处理它。
这里有一个很棒的演示: https : //www.eventedmind.com/feed/meteor-create-a-custom-ejson-type 。 完整文档也位于此处: http : //docs.meteor.com/#/full/ejson 。 但是这是一个简短的版本:
在自定义类型中添加一个名为typeName的方法:
\n ShoppingCart.prototoype.typeName = function(){\n 返回“购物车”;\n };\n
添加另一个方法toJSONValue:
\n ShoppingCart.prototype.toJSONValue = function(){\n / *返回对象的JSON兼容版本* /\n };\n
最后,使用以下命令将自定义类型添加到EJSON:
\n EJSON.addType(“ ShoppingCart”,function fromJSONValue(value){\n / *从JSON对象“值”返回您自定义类型的对象* /\n };\n
注意:步骤1和3中的“类型名称”必须完全匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.