每次我对应用程序有新想法时,我都会从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有一百万个惊人的功能,我真的很想利用它们。所以我希望有人可以指路我。我在这个过程中和最终的结果中犯了什么错误?在流星应用程序中完成这项工作的最好,最干净,最简单的方法是什么。
这是如此复杂,在一个框架内,使许多其他事情变得如此简单。那么我怎样才能进行简单的数据库查询呢?
答案 0 :(得分:2)
考虑一下他们provide的流星示例。所有示例都具有获取用户输入,管理集合以及向模板显示集合查询的功能。
您的大多数代码看起来很好,但您一次提出几个问题,并从一个难以回答的角度出发。一些一般性说明:
null.someThingIWant
是一个错误。一个方便的模式是return something && something.someThingIWant;
上面代码中的一个问题是您的发布未返回查询结果。我认为这是一个错字。