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

时间:2015-05-18 05:04:06

标签: javascript html mongodb meteor

我决定将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属性。

2 个答案:

答案 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方式处理它。