当该元素的值更改时,是否会自动重新执行从元素读取值的 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(); // <-----------
我需要先用值填充一组 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(); // <-----------