我决定在我当前的web应用程序项目中使用Meteor。在这个网站上,我们希望用户拥有自己的汽车库存,并需要使用Meteor的侧边栏模板引擎以以下格式从Mongo Collection中显示它们。
Car 1
Engine: 6-cylinder
Color: black
Car 2
Engine: 4-cylinder
Color: white
我们的模板设置如下:
<template name=”cars”>
{{#each cars}}
{{> car}}
{{/each}}
</template>
<template name=”car”>
Engine: {{engine}}
Color: {{color}}
</template>
我们的助手:
Template.cars.helpers({
return Cars.find({ownerId: Meteor.user_id()});
});
Template.car.helpers({
engine: function(){
var car_id = “???”;
return Car.findOne({car_id: car_id}).engine;
},
color: function(){
var car_id = “???”;
return Car.findOne({car_id: car_id}).color;
},
});
我的问题是将car_id传递给辅助函数。我知道我们可以通过模板上的数据属性(如{{car data=carId}}
)将参数传递给辅助函数,但随后我们需要从Template.cars.helpers
传递car_id。
是否有一个简单的方法来完成这一点,我没有看到或我误解了流星和侧边栏的基本原理?
注意:实际的应用程序与汽车无关,也没有这么简单。因此,有必要使用单独的Mongo Collections来保存Cars和Car属性。
当您使用#each
迭代游标时,内部上下文变成单个文档。在您的示例中,car
模板具有汽车文档的上下文。因此,不需要帮助程序来呈现{{engine}}
或{{color}}
。
为了更好地理解这一点,我建议阅读《流星模板指南》。数据上下文。
但是,如果为了执行一些其他操作(可能是一个集合连接),您需要helper中car的_id
,那么您可以通过this._id
访问它(同样,本例中helper的上下文是一个文档)。下面是一个例子:
Template.car.helpers({
driver: function() {
return Meteor.users.findOne({carId: this._id});
}
});
您设置它的方式是首先在cars中进行搜索,然后对cars中的每条记录进行findOne操作,对car表中的汽车进行findOne操作,对吗?这可能导致了两个问题,而不是一个。
首先,您有传递您提到的car_id的问题,其次,您有速度的问题,因为在单个car表中逐个查找您在cars表中找到的每个记录需要花费时间。
如果您确实必须保留这两个单独的表,那么我建议您在第一个帮助器中完成所有的数据库工作,并取消第二个帮助器。
换句话说,在第一个helper中查找cars表中的所有记录,然后在同一个helper中查找单个car表中的所有记录,并将这个新数组传递给#each cars。这样你就可以去掉template.car.helper,让Blaze用正常的Meteor方式来处理它。