此Meteor代码允许用户从下拉选项列表中进行选择,并使用所选值来订阅集合并返回要显示的文档。
订阅速度不够快,因此在执行myCol.findOne({person: fName})
时我得到了一个未定义的内容。
知道怎么解决吗? THX
Template.manualSearch.events({
'change select': function () {
let name = $("#fName option:selected").html().toLowerCase();
dict.set('person', fName);
Meteor.subscribe('myCol', dict.get('person'));
let personDoc = myCol.findOne({person: fName});
if (personDoc) { // <=== always undefind
let info = JSON.stringify(personDoc);
document.getElementById('debug').innerHTML = info;
}
}
});
<template name="manualSearch">
<select name="nmnm" id="fName">
{{#if Template.subscriptionsReady}}
{{#each fNames}}
<option>{{this.fName}}</option>
{{/each}}
{{/if}}
</select>
<p id="debug"></p>
</template>
答案 0 :(得分:1)
在活动中订阅真的是个坏主意。这样您就可以在订阅后打开订阅而无需清理它们。您应该将订阅移动到onCreated
回调中,然后使用Session
或ReactiveVar
之类的反应式var来更新订阅。这样Meteor负责订阅生命周期。你的返回值应该是帮手。
// js
Template.manualSearch.onCreated(function() {
Session.setDefault('person', 'some-default-name');
this.autorun(() => {
this.subscribe('myCol', Session.get('person'));
});
});
Template.manualSearch.helpers({
info() {
const person = myCol.findOne({ person: Session.get('person') });
if (person) {
return JSON.stringify(person);
}
return null;
}
});
Template.manualSearch.events({
'change select'() {
Session.set('person', $("#fName option:selected").html().toLowerCase());
}
});
// html
<template name="manualSearch">
...
<p id="debug">{{info}}</p>
</template>