我有一个简单的应用程序设置,显示一个列表Projects.我已经删除了autopublish包,所以我不会将所有内容发送给客户端.
<template name="projectsIndex">
{{#each projects}}
{{name}}
{{/each}}
</template>
Run Code Online (Sandbox Code Playgroud)
当autopublish打开时,这将显示所有项目:
if Meteor.isClient
Template.projectsIndex.projects = Projects.find()
Run Code Online (Sandbox Code Playgroud)
删除后,我还要另外做:
if Meteor.isServer
Meteor.publish "projects", ->
Projects.find()
if Meteor.isClient
Meteor.subscribe "projects"
Template.projectsIndex.projects = Projects.find()
Run Code Online (Sandbox Code Playgroud)
那么,说客户端find()方法只搜索从服务器端发布的记录是否准确?它一直在绊倒我,因为我觉得我应该只打电话find()一次.
使用Meteor,我想知道如何最好地处理共享相同服务器端数据库集合的不同客户端集合.考虑以下示例:我有一个User集合,在我的客户端,我有一个朋友用户列表,我有一个搜索功能,对整个用户数据库执行查询,返回与查询匹配的用户名列表.
在发布服务器端方法上,我对同一个集合有两个查询,它们返回不同的文档集.这些数据应该在客户端分成两个独立的集合吗?或者,与两个查询匹配的所有用户文档是否最终都在同一个集合中?如果是后者,我会重复用于服务器端和客户端查询的代码吗?
在服务器上:
Meteor.publish('searchResults', function(query){
var re = new RegExp(query, 'i')
return Users.find({ 'name' : {$regex: re}})
})
Run Code Online (Sandbox Code Playgroud)
在客户端:
Session.set('searchQuery', null)
Meteor.autosubscribe(function(){
Meteor.subscribe('searchResults', Session.get('searchQuery'))
})
Template.search.events = {
'keyup #user-search' : function(e){
Session.set('searchQuery', e.target.value)
}
}
_.extend(Template.search, {
searchResults: function() {
var re = new RegExp(Session.get('searchQuery'), 'i')
return Users.find({ 'name' : {$regex: re}})
}
})
Run Code Online (Sandbox Code Playgroud)
这似乎是一个看似合理的解决方案,但不是最佳解决方案.如果我想创建一个新的客户端集合,该集合由来自多个服务器端集合的搜索结果组成,该怎么办?