如何在Meteor中进行简单的数据库查询

时间:2013-11-11 05:41:39

标签: javascript mongodb meteor meteorite database

每次我对应用程序有新想法时,我都会从Meteor开始。每次我最终都使用其他东西。我认为这归结于我不知道如何进行简单的数据库查询。

这是一个假设的例子。我想创建一个应用程序,用户在框中键入内容,按下按钮,然后显示他们输入的任何内容的图像。它使用了一些图像搜索API。

<template name="image">
    <input type="text" class="description"></input>
    <button class="showImage"></button>
    <img src="{{img}}"></img>
</template>
到目前为止,似乎很简单。现在没有办法将信息发送到客户端而不将其首先放入数据库中,这是我的理解。假设我们有一些函数addToDB,它接受查询并将图像信息输入数据库。

Template.image.events({
    'click .showImage': function() {
        addToDB($('.description').val());
    }
});

大!那还不错。但现在将数据发送回客户端......

//server.js
Meteor.publish("image", function(query) {
    Images.find({q: query});
}

但是等等。我们不能只在客户端加载时订阅,因为我们还不知道查询。所以事件处理程序可能需要

Template.image.events({
    'click .showImage': function() {
        addToDB($('.description').val());
        Deps.autorun(function() {
        Meteor.subscribe("images", $('.description').val());
    });
    }
});

好的,让我们把它提供给模板......

Template.image.img = function() {
    return Images.findOne().imgsrc;
}

不,这会导致错误,因为首次加载模板时,我们还没有订阅图像。所以我们可以这样更新模板:

<template name="image">
    <input type="text" class="description"></input>
    <button class="showImage"></button>
    {{#each info}}
    <img src="{{info.img}}"></img>
    {{/each}}
</template>

然后将模板填充功能更改为:

Template.image.info = function() {
    return Images.find({}, {limit: 1});
}

瞧!

我花了更长的时间才愿意承认今天晚上所有这一切都在磕磕绊绊。如果它只是普通的旧节点,我可以使用一些简单的jQuery。

但Meteor有一百万个惊人的功能,我真的很想利用它们。所以我希望有人可以指路我。我在这个过程中和最终的结果中犯了什么错误?在流星应用程序中完成这项工作的最好,最干净,最简单的方法是什么。

这是如此复杂,在一个框架内,使许多其他事情变得如此简单。那么我怎样才能进行简单的数据库查询呢?

1 个答案:

答案 0 :(得分:2)

考虑一下他们provide的流星示例。所有示例都具有获取用户输入,管理集合以及向模板显示集合查询的功能。

您的大多数代码看起来很好,但您一次提出几个问题,并从一个难以回答的角度出发。一些一般性说明:

  • 考虑使用Session来保存用户使用事件设置的变量。
  • 通过将Session变量传递给Deps.autorun函数
  • 来订阅您想要的数据
  • 通过将Session变量传递给模板来显示所需的数据。
  • 基本javascript规则仍然适用 - null.someThingIWant是一个错误。一个方便的模式是return something && something.someThingIWant;

上面代码中的一个问题是您的发布未返回查询结果。我认为这是一个错字。