在Meteor web应用程序中显示多维数据库文档



我决定在我当前的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方式来处理它。

最新更新