簡體   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