繁体   English   中英

会话中流星存储和检索自定义对象

[英]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 但是这是一个简短的版本:

  1. 在自定义类型中添加一个名为typeName的方法:

    \n ShoppingCart.prototoype.typeName = function(){\n     返回“购物车”;\n };\n
  2. 添加另一个方法toJSONValue:

    \n ShoppingCart.prototype.toJSONValue = function(){\n     / *返回对象的JSON兼容版本* /\n };\n
  3. 最后,使用以下命令将自定义类型添加到EJSON:

    \n EJSON.addType(“ ShoppingCart”,function fromJSONValue(value){\n     / *从JSON对象“值”返回您自定义类型的对象* /\n };\n

注意:步骤1和3中的“类型名称”必须完全匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM