我决定将Meteor用于我当前的Web应用程序项目。在这个网站上,我们希望用户拥有自己的汽车库存,并且需要使用Meteor的Sidebars模板引擎以下列格式从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。
有没有一种简单的方法可以实现这一点,我没有看到或者我误解了Meteor和Sidebars的基本原理?
注意:实际应用与汽车无关,并不是这么简单。因此,有必要使用单独的Mongo Collections来保存Cars和Car属性。
答案 0 :(得分:1)
当您使用#each
迭代游标时,内部上下文将成为单个文档。在您的示例中,car
模板具有汽车文档的上下文。因此,为了呈现{{engine}}
或{{color}}
,无需帮助者。
为了更好地理解这一点,我建议您阅读A Guide to Meteor Templates & Data Contexts。
但是,如果您需要帮助者的_id
汽车以执行其他操作(也许是集合加入),那么您可以通过this._id
访问它(再次此示例中的帮助程序的上下文是文档)。这是一个例子:
Template.car.helpers({
driver: function() {
return Meteor.users.findOne({carId: this._id});
}
});
答案 1 :(得分:1)
你设置它的方式是先在汽车中进行搜索,然后对于汽车中的每个记录,你正在为汽车桌上的汽车做一个findOne,对吧?这可能不是一个问题,而是两个问题。
首先你有传递你提到的car_id的问题,其次你有速度问题,因为你在汽车表中找到的每条记录逐个查看单个汽车表需要时间。
如果你真的必须保留这两个单独的表,那么我建议你在第一个帮助器中完成所有数据库工作,并消除第二个帮助器。
换句话说,在第一个帮助器中查找cars表中的所有记录,然后在同一个帮助器中查找单个car表中的所有记录,并将这个新数组传递给#each cars。这样你就可以消除template.car.helper并让Blaze以正常的Meteor方式处理它。