我正在使用名为Courses
的数据库构建应用。用户应该能够使用search
模板搜索课程,并选择他们想要添加的课程。他们选择的课程应显示在selected
模板中。
Courses
目前有两个出版物:courses.all
和courses.search
,其中第二个出版物采用搜索参数:
Meteor.publish('courses.all', function () {
return Courses.find({});
});
Meteor.publish('courses.search', function(q) {
let query = {}, projection = {limit: 10, sort: {dept: 1, courseNo: 1}};
if (q && q.length > 0) {
query = {
$text: {
$search: q,
}
}
}
let out = Courses.find(query, projection);
return out;
});
(请注意,courses.search
必须在服务器上进行,因为Minimongo尚不支持$text
运算符。)
search
模板然后订阅courses.search
(遵循本指南:https://themeteorchef.com/tutorials/simple-search):
Template.search.onCreated(function searchOnCreated() {
this.state = new ReactiveDict();
let template = Template.instance();
template.searchQuery = new ReactiveVar();
template.searching = new ReactiveVar(false);
this.autorun(() => {
this.subscribe('courses.search', template.searchQuery.get(), () => {
setTimeout(() => {
template.searching.set(false);
Tracker.flush();
$(".collapsible").collapsible(); // needed for the UI
}, 300);
});
});
});
然后,每当提交搜索表单时,template.searchQuery
都会更新:
"submit #search-form" (evt, template) {
evt.preventDefault();
let value = $("[name=search]").val().trim();
if (value !== "") {
template.searchQuery.set(value);
template.searching.set(true);
} else if (value === "") {
template.searchQuery.set(value);
}
}
足够简单。然后,在schedule
内,我订阅courses.all
,并致电Courses.find
,我认为应该从courses.all
返回结果:
courses() {
let out = Meteor.user().courses.map((course) => {
return Courses.findOne(course);
});
return out;
}
问题是:courses.search
对schedule
的调用中找不到搜索结果中未返回的任何课程ID(即Courses.findOne
的输出中)。但我知道,您不能为同一个模板提供两个模板级订阅。您是否也不能对不同的模板进行两次模板级订阅?如果是这样,任何人都可以建议一种解决方法,让schedule
看到课程中的所有值,而search
只能看到搜索结果吗?
(我正在使用Meteor 1.4.2.1。)