假设我创建了一个像这样的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对象函数中。
这种方法有效吗?对象会保持持久性吗?
答案 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?
}
}