每次我对应用程序有新的想法时,我都会从 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});
}
但是等等。我们不能只在客户端加载时订阅,因为我们还不知道查询。所以也许事件处理程序需要是</p>
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 的一百万个惊人功能。所以我希望有人能给我指路。我在这个过程中以及最终的结果中犯了什么错误?在 meteor 应用程序中完成这项工作的最好、最干净、最简单的方法是什么。
在一个让许多其他事情变得如此简单的框架内,这太复杂了。那么我怎样才能进行简单的数据库查询呢?
最佳答案
考虑查看 meteor 示例 provide .所有示例都具有获取用户输入、管理集合以及向模板显示集合查询的功能。
您的大部分代码看起来都不错,但您同时提出了几个问题,并且从一个难以回答的 Angular 出发。一些一般说明:
- 考虑使用 Session 来保存用户通过事件设置的变量。
- 通过将 Session 变量传递给 Deps.autorun 函数来订阅您想要的数据
- 通过将 Session 变量传递给模板来显示您想要的数据。
- 基本的 javascript 规则仍然适用 -
null.someThingIWant
是一个错误。一个方便的模式是return something && something.someThingIWant;
上面代码中的一个问题是您的发布没有返回查询结果。我认为这是一个错字。
关于javascript - 如何在 Meteor 中进行简单的数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19899599/