Meteor js中的Javascript对象持久性

时间:2015-05-14 07:11:01

标签: javascript meteor

假设我创建了一个像这样的js对象

Cart = function Cart(){
    this.contents = new Array();
}

Cart.prototype = {
   add : function(obj){
      this.contents.push(obj);
   }
}

并将其放在项目lib文件夹中,以便可以在项目范围内使用此对象。

是否可以在模板后端(js文件)中持久使用此对象?例如,我声明:

Template.pageA.rendered = function(){
    var smallCart = new Cart();
}

我可以在模板事件中使用它吗?例如:

Template.pageA.events = {
  'click button#add' : function(event){
     smallCart.add('newItem'); //Is this object as same as the one in rendered?
   }
} 

我一直在使用Sessions做一些事情但是当有很多操作需要完成时,events将会出现业务逻辑和计算混乱。我想避免这种情况,因此我想把逻辑放到Javascript对象函数中。

这种方法有效吗?对象会保持持久性吗?

3 个答案:

答案 0 :(得分:1)

您可以将该代码放在Meteor.startup中,因此该对象将始终存在。

Meteor.startup(function(){
 Cart = function Cart(){
    this.contents = new Array();
 }

 Cart.prototype = {
   add : function(obj){
      this.contents.push(obj);
   }
 }
})

此对象是否与渲染中的对象相同?是

答案 1 :(得分:1)

从我的角度来看,将购物车的类定义放入lib文件夹可能会很好。如果它只是客户端代码,您可以将它存储到cart.js文件中到您的客户端文件夹中。

此定义将在客户端提供。

然后您需要存储购物车的实例。在您的模板中加入购物车可能是一个好主意(您之前不需要它),但您需要将引用存储到客户端应用程序范围(通常是在客户端文件夹根目录下的app.js中) )

的客户机/ cart.js

Cart = function() {}....

的客户机/ app.js

myCart = null;

在模板中,您可以实例化购物车

myCart = new Cart();

如果您只在一个模板上使用,则可以将实例直接存储到模板中的控制器逻辑中。将它附加到模板的渲染是有点连线的,因为你通常处理模板渲染逻辑。

这样,将为您网站上的每个用户创建一个购物车并称为模板。如果你有一个使用铁路由器的多页面应用程序,只要你已经在模板中创建了myCart,myCart就会随时可用。

请注意,通过这种方式,如果客户端“刷新”重新加载JavaScript代码的页面,您将丢失当前的购物车。您需要将购物车保留在本地存储上才能支持刷新。在所有情况下都不值得,但对于购物车,可能很有用

答案 2 :(得分:0)

将购物车代码放入lib是正确的,它随处可用。

smallCart而言,您已将其声明为函数内部,因此其他模板函数无法使用它。

在两个函数之外声明它,它们都可用。

var smallCart;

Template.pageA.rendered = function(){
    smallCart = new Cart();
}

Template.pageA.events = {
  'click button#add' : function(event){
     smallCart.add('newItem'); //Is this object as same as the one in rendered?
   }
}