在collection.find之前等待订阅的模板事件

时间:2017-08-01 07:32:18

标签: javascript meteor

此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>

1 个答案:

答案 0 :(得分:1)

在活动中订阅真的是个坏主意。这样您就可以在订阅后打开订阅而无需清理它们。您应该将订阅移动到onCreated回调中,然后使用SessionReactiveVar之类的反应式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>