Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor在会话中存储和检索自定义对象_Javascript_Jquery_Meteor - Fatal编程技术网

Javascript Meteor在会话中存储和检索自定义对象

Javascript Meteor在会话中存储和检索自定义对象,javascript,jquery,meteor,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(); } 我

我创建了一个自定义购物车对象,并将其放在
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')
在页面
创建
阶段

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不是一个函数
,指向
cart.addItem(item)
行。如果我将其更改为此,它将工作,但当然,由于每次创建新的购物车,我无法在购物车中累积项目

var cart = new ShoppingCart();
cart.addItem(item);
Session.set('shoppingCart',cart);
我应该如何正确地从会话中存储和检索对象?它看起来像是从Session.get()返回的对象,但不知何故没有被视为ShoppingCart。我错过了任何类型转换吗?

如前所述,您只能在会话中存储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。要存储自定义对象,您需要能够在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'));

我遇到了同样的问题。实际上,Meteor会话(和集合)只能存储EJSON类型,因此您的ShoppingCart自定义类型将作为普通对象从会话中检索

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

这里有一个很好的演示:。完整文档也在此处:。但简短的说法是:

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

    ShoppingCart.prototoype.typeName = function(){ return "ShoppingCart"; }; ShoppingCart.ProtoType.typeName=函数(){ 返回“购物车”; };
  • 添加另一个名为toJSONValue的方法:

    ShoppingCart.prototype.toJSONValue = function(){ /* return a JSON compatible version of your object */ }; ShoppingCart.prototype.toJSONValue=function(){ /*返回对象的JSON兼容版本*/ };
  • 最后,使用以下命令将自定义类型添加到EJSON:

    EJSON.addType("ShoppingCart", function fromJSONValue(value){ /* return an object of your custom type from the JSON object 'value' */ }; addType(“ShoppingCart”,函数fromJSONValue(value){ /*从JSON对象“value”返回自定义类型的对象*/ };

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

    我遇到了相同的问题。实际上,Meteor会话(和集合)只能存储EJSON类型,因此您的ShoppingCart自定义类型将作为普通对象从会话中检索

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

    这里有一个很好的演示:。完整的文档也在这里:。但是一个简短的版本是:

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

    ShoppingCart.prototoype.typeName = function(){ return "ShoppingCart"; }; ShoppingCart.ProtoType.typeName=函数(){ 返回“购物车”; };
  • 添加另一个名为toJSONValue的方法:

    ShoppingCart.prototype.toJSONValue = function(){ /* return a JSON compatible version of your object */ }; ShoppingCart.prototype.toJSONValue=function(){ /*返回对象的JSON兼容版本*/ };
  • 最后,使用以下命令将自定义类型添加到EJSON:

    EJSON.addType("ShoppingCart", function fromJSONValue(value){ /* return an object of your custom type from the JSON object 'value' */ }; addType(“ShoppingCart”,函数fromJSONValue(value){ /*从JSON对象“value”返回自定义类型的对象*/ };

  • 注:“类型名称”第1步和第3步必须完全匹配。

    会话只能存储EJSON-able对象。您的
    ShoppingCart
    不支持EJSON。我不知道这个问题的最佳解决方案,所以我把它留给另一个解决方案。@PeppeL-G是否可以将其键入回
    ShoppingCart
    。在ASP.NET中可以这样做,那么Javascript呢?会话只能存储EJSON-able对象。您的
    ShoppingCart
    不支持EJSON。我不知道这个问题的最佳解决方案,所以我将它留给另一个解决方案。@PeppeL-G是否可以将其键入回
    ShoppingCart
    。在ASP.NET中可以这样做,那么Javascript是如何实现的?是否可以在so中使用
    EJSON.addType
    me way?这是可能的,但并不简单。您需要将
    factory
    方法传递到
    addType
    ,这与上面的
    fromJSON
    相同。此外,
    ShoppingCart
    需要实现
    toJSONValue
    。因此您仍然需要定义这两种方法。但您是对的,这是一种更好的方法,因为您能够做到这一点像数组一样存储东西更容易购物车。请参阅。只想添加对象数组,即
    [{“param”:“value1”}、{“param”:“value2”}、]
    JSON.stringify
    -只要有人对此感到好奇,就可以了。难道不可能以某种方式使用
    EJSON.addType
    吗?这是可能的,但并不容易。你需要将
    工厂
    方法传递到
    addType
    ,这与上面的
    fromJSON
    相同。此外,
    购物车
    也需要实现ent
    toJSONValue
    。因此您仍然需要定义这两种方法。但您是对的,这是一种更好的方法,因为您可以更轻松地存储类似于数组ShoppingCarts的内容。请参阅。只需添加对象数组,即
    [{“param”:“value1”},{“param”:“value2”},]
    JSON.stringify
    ——只要有人对此感到好奇,它就可以。