当该元素的值更改时,是否会自动重新执行从元素读取值的 Meteor Helper?

Will a Meteor Helper that reads a value from an element automatically be re-executed when that element's value changes?

我需要先用值填充一组 select 元素,如下所示:

<select class="jobLoc" id="date1Shift1JobLoc1" name="date1Shift1JobLoc1">
  {{#each jobLocations}}
    <option value={{jl_jobloc}}>{{jl_jobloc}}</option>
  {{/each}}
</select>

...但是当另一个相关的 select 元素发生变化时更新那些(用子集替换 joblocs 的初始超集)。

助手 returns 一组基于相关 select 元素值的文档,类似这样(伪代码):

Template.tblScheduler.helpers({
  jobLocations: function() {
    var worker = $('#worker').val;
    if (worker == '') {
        return JobLocations.find(); // return all
    } else {
        return JobLocations.find({ jl_workerid: worker }); // a worker was selected; use it to return a subset
    }
  }
});

首次呈现模板时,"date1Shift1JobLoc1Count" select 元素会填充所有 jobloc;但是,如果一个工人被 selected,"date1Shift1JobLoc1Count" 中的选项应该被清除,然后用适当的子集替换。

问题是,由于 Meteor 发现 helper 依赖于“#worker”select 元素的值,所以它会自动运行吗?我希望如此……但希望我希望太多。如果我的疑惑是有根据的,如何让helper重新运行,让template重新渲染呢?我是否需要从模板事件处理程序中执行此操作,如下所示:

Template.tblScheduler.events({
    "change #worker": function (event) {
      // Is it possible to call the jobLocations helper from here?
   }
}); 

?还是我必须从那里 "manually" 开始,比如 (pseudocode):

Template.tblScheduler.events({
    "change #worker": function (event) {
        var worker = $('#worker').val;
        var arrayOfDocs = Meteor.call('getJobLocsForWorker(worker))');
        // assign the values in arrayOfDocs to the "date1Shift1JobLoc1" select element
     }
}); 

或者有别的方法吗?

jQuery 元素是非反应性数据源,因为 helpers depend on it I believe your best bet is to wrap this value in a ReactiveVar:

var worker = new ReactiveVar('')

Template.tblScheduler.helpers({
  jobLocations : function() {
    var workerValue = worker.get() //<- Register the dependency
    //Your cursor logic here
  }
})

Template.tblScheduler.events({
  'change #worker' : function() {
    worker.set($('#worker').val)
  }
})

您可能想要 _.debounce 您的 change 事件处理,以便用户不会看到整个 UI 在他键入的每个字母处闪烁和更新。

一种可能的解决方案是明确声明助手取决于您的#worker 选择器。您可以使用 Dependency 对象来执行此操作。

var workerDep = new Deps.Dependency();

然后,将此对象用于 "flag" 助手,如下所示:

Template.tblScheduler.helpers({
  jobLocations: function() {
    workerDep.depend();                 // <-----------
    var worker = $('#worker').val;
    if (worker == '') {
        // ...

要触发显式依赖,请使用:

Template.tblScheduler.events({
    "change #worker": function (event) {
     workerDep.changed();             // <-----------