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

时间:2014-07-01 07:11:02

标签: javascript jquery meteor

我创建了一个自定义购物车对象,并将其放在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();
}

我初始化了购物车,并在页面Session.set('shoppingCart')阶段将其存储为created

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。我错过了任何类型演员吗?

2 个答案:

答案 0 :(得分:3)

如上所述@Peppe L-G,您只能在会话中存储EJSON。要存储自定义对象,您需要能够在EJSONs之间手动转换它。例如:

_.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:

Session.set('shoppingCart', cart.toJSON());

并恢复:

ShoppingCart.fromJSON(Session.get('shoppingCart'));

答案 1 :(得分:1)

我遇到了同样的问题。基本上发生的事情Meteor Sessions(和Collections)只能存储EJSON类型,因此您的ShoppingCart自定义类型将作为普通对象从Session中检索。

虽然您可以手动转换为EJSONs,但最终可能需要在很多不同的地方重复执行此操作。如果您的ShoppingCart是另一个对象的成员,您还必须手动转换该成员。最好使用EJSON.addType告诉Meteor如何在存储或检索该类型对象的任何地方自动处理它。

这里有一个很棒的演示:https://www.eventedmind.com/feed/meteor-create-a-custom-ejson-type。完整的文档也在这里:http://docs.meteor.com/#/full/ejson。但简短的版本就是这样:

  1. 向名为typeName的自定义类型添加方法:

    ShoppingCart.prototoype.typeName = function(){
        return "ShoppingCart";
    };
    
  2. 添加另一个名为toJSONValue的方法:

    ShoppingCart.prototype.toJSONValue = function(){
        /* return a JSON compatible version of your object */
    };
    
  3. 最后,使用以下命令将自定义类型添加到EJSON:

    EJSON.addType("ShoppingCart", function fromJSONValue(value){
        /* return an object of your custom type from the JSON object 'value' */
    };
    
  4. 注意:"类型名称"在步骤1和3中必须完全匹配。