Javascript 当元素的值发生变化时,从元素中读取值的Meteor助手是否会自动重新执行?

Javascript 当元素的值发生变化时,从元素中读取值的Meteor助手是否会自动重新执行?,javascript,jquery,mongodb,meteor,meteor-helper,Javascript,Jquery,Mongodb,Meteor,Meteor Helper,我需要首先用值填充一组select元素,如下所示: <select class="jobLoc" id="date1Shift1JobLoc1" name="date1Shift1JobLoc1"> {{#each jobLocations}} <option value={{jl_jobloc}}>{{jl_jobloc}}</option> {{/each}} </select> 首次呈现模板时,date1Shift1JobL

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

<select class="jobLoc" id="date1Shift1JobLoc1" name="date1Shift1JobLoc1">
  {{#each jobLocations}}
    <option value={{jl_jobloc}}>{{jl_jobloc}}</option>
  {{/each}}
</select>
首次呈现模板时,date1Shift1JobLoc1Count选择元素将填充所有Jobloc;但是,如果选择了工作者,则应清除Date1Shift 1Jobloc1Count中的选项,然后用适当的子集替换

问题是,由于Meteor看到助手依赖于worker select元素的值,这会自动工作吗?我希望如此……但我希望的太多了。如果我的怀疑是有根据的,我如何让助手重新运行,让模板重新渲染?我是否需要从模板事件处理程序执行此操作,类似以下内容:

Template.tblScheduler.events({
    "change #worker": function (event) {
      // Is it possible to call the jobLocations helper from here?
   }
}); 
Template.tblScheduler.helpers({
  jobLocations: function() {
    workerDep.depend();                 // <-----------
    var worker = $('#worker').val;
    if (worker == '') {
        // ...
??或者我必须从那里手动执行,比如伪代码:

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
    }
  }
});
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元素是非反应性数据源,由于依赖于它,我认为最好的方法是将此值包装在一个:


您可能希望更改事件处理,这样用户就不会看到整个UI在她键入的每个字母时闪烁和更新。

jQuery元素是非反应性数据源,因此我相信您最好将此值包装在一个:


您可能希望更改事件处理,以便用户不会在她键入的每个字母时看到整个UI闪烁和更新。

一种可能的解决方案是明确声明助手依赖于您的工作选择器。您可以使用依赖项对象来实现这一点

然后,使用此对象标记辅助对象,如下所示:

Template.tblScheduler.events({
    "change #worker": function (event) {
      // Is it possible to call the jobLocations helper from here?
   }
}); 
Template.tblScheduler.helpers({
  jobLocations: function() {
    workerDep.depend();                 // <-----------
    var worker = $('#worker').val;
    if (worker == '') {
        // ...
要触发显式依赖项,请使用:

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

一种可能的解决方案是显式声明助手依赖于工作选择器。您可以使用依赖项对象来实现这一点

然后,使用此对象标记辅助对象,如下所示:

Template.tblScheduler.events({
    "change #worker": function (event) {
      // Is it possible to call the jobLocations helper from here?
   }
}); 
Template.tblScheduler.helpers({
  jobLocations: function() {
    workerDep.depend();                 // <-----------
    var worker = $('#worker').val;
    if (worker == '') {
        // ...
要触发显式依赖项,请使用:

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

请注意,在代码中使用==将匹配任何虚假值,包括0、null或未定义。请注意,在代码中使用==将匹配任何虚假值,包括0、null或未定义。当两个答案相同时,除了使用不同的API=p@KyllLOL:不过我不知道反应性VAR,谢谢你的提示!当两个答案相同时,除了使用不同的API=p@KyllLOL:不过我不知道反应性VAR,谢谢你的提示!worker的定义应该放在哪里?在引用它的.js文件的顶部?有多个选项。可以将其放在模板实例的数据中,也可以像这里一样放在上面的范围中。worker的定义应该放在哪里?在引用它的.js文件的顶部?您有多个选项。可以将其放在模板实例的数据中,也可以像这里一样放在上面的范围中。