Meteor-AutoForm:如何根据另一个控件更新 select 选项
Meteor-AutoForm: How to update select options based on another control
我一直在寻找 SO 问题的答案,这些问题应该非常简单,但对于我来说我无法弄清楚。
基本上我有一个带有两个 select 控件的 meteor-autoform:
<template name="processFormTemplate">
{{#autoForm id="processForm" collection="Processes" type=formAction doc=doc validation="blur"}}
<div class="col-md-12">
{{> afQuickField name="elementId" options=elements}}
{{> afQuickField name="categoryId" options=categories}}
{{> afQuickField name="title"}}
{{> afQuickField name="desc" rows=4}}
</div>
{{>formButtons}}
{{/autoForm}}
</template>
这些然后有助手来填充选项:
Template.processFormTemplate.helpers({
elements: function() {
return getFormElements();
},
categories: function(elementId) {
return getFormCategories(this.doc.elementId);
}
});
lib/methods.js
getFormElements = function() {
var options = [];
Elements.find({}, {sort: {ref:1}}).forEach(function (element) {
options.push({
label: element.title, value: element._id
});
});
return options;
};
getFormCategories = function(elementId) {
var options = [];
var filter = {};
if (!isBlank(elementId)) {
filter.elementId = elementId;
}
Categories.find(filter, {sort: {ref:1}}).forEach(function (d) {
options.push({
label: d.title, value: d._id
});
});
return options;
};
现在我知道这是行不通的,因为助手不是被动的,但我不知道如何改变这种行为。我也试过挂钩到 'change' 事件,但由于某种原因它从未触发:
Template.processFormTemplate.events({
'change #elementId': function(e) {
console.log($('[name="elementId"]').val() + ' is now selected');
}
});
要求的行为是,当在第一个列表中 selected 一个新的 elementId 时,第二个列表中的选项列表应该根据 selected elementId 刷新。
非常感谢任何帮助。
谢谢,
大卫
我已经设法让它工作了 - 有几处错误:
我需要将 'id' 添加到第一个 select 控件,以便我可以捕获它的更改事件:
{{> afQuickField name="elementId" id="elementId" options=elements}}
然后我使用了一个 Reactive Dict 变量,然后在更改的事件中设置它。会话变量可能会做同样的工作。
Template.processFormTemplate.events({
'change #elementId': function() {
dict.set('activeElementId', $('select#elementId').val());
}
});
并将其用作我的类别助手中的参数:
categories: function(elementId) {
return getFormCategories(dict.get('activeElementId'));
}
希望这对遇到类似问题的其他人有所帮助。
我之前遇到过同样的问题,我花了好几个小时才解决。您必须使用简单的模式来获取所选选项的值,就像这样使用自动表单的 api 调用 Autoform.getFieldValue:
Schemas.Store = new SimpleSchema({
center: {
type: String,
optional: true,
autoform: {
type: "select",
options: function () {
return Centers.find().map(function (c) {
return {label: c.name, value: c._id};
});
}
}
},
region: {
type: String,
optional: true,
autoform: {
type: "select",
options: function () {
if (Meteor.isClient) {
var docId = '';
docId = AutoForm.getFieldValue('storesForm', 'center');
return Regions.find({center: docId}).map(function (c) {
return {label: c.name + ' (' + c.code + ')', value: c._id};
});
}
}
}
},
store_name: {
type: String
}
});
顺便说一句,由于在 5.0
中使用 Autoform.getFieldValue 时遇到问题,我仍在使用 autoform@4.2.2
我已经向 aldeed 报告了 5.0.3 中的问题:https://github.com/aldeed/meteor-autoform/issues/785#issuecomment-84600515
我一直在寻找 SO 问题的答案,这些问题应该非常简单,但对于我来说我无法弄清楚。
基本上我有一个带有两个 select 控件的 meteor-autoform:
<template name="processFormTemplate">
{{#autoForm id="processForm" collection="Processes" type=formAction doc=doc validation="blur"}}
<div class="col-md-12">
{{> afQuickField name="elementId" options=elements}}
{{> afQuickField name="categoryId" options=categories}}
{{> afQuickField name="title"}}
{{> afQuickField name="desc" rows=4}}
</div>
{{>formButtons}}
{{/autoForm}}
</template>
这些然后有助手来填充选项:
Template.processFormTemplate.helpers({
elements: function() {
return getFormElements();
},
categories: function(elementId) {
return getFormCategories(this.doc.elementId);
}
});
lib/methods.js
getFormElements = function() {
var options = [];
Elements.find({}, {sort: {ref:1}}).forEach(function (element) {
options.push({
label: element.title, value: element._id
});
});
return options;
};
getFormCategories = function(elementId) {
var options = [];
var filter = {};
if (!isBlank(elementId)) {
filter.elementId = elementId;
}
Categories.find(filter, {sort: {ref:1}}).forEach(function (d) {
options.push({
label: d.title, value: d._id
});
});
return options;
};
现在我知道这是行不通的,因为助手不是被动的,但我不知道如何改变这种行为。我也试过挂钩到 'change' 事件,但由于某种原因它从未触发:
Template.processFormTemplate.events({
'change #elementId': function(e) {
console.log($('[name="elementId"]').val() + ' is now selected');
}
});
要求的行为是,当在第一个列表中 selected 一个新的 elementId 时,第二个列表中的选项列表应该根据 selected elementId 刷新。
非常感谢任何帮助。
谢谢, 大卫
我已经设法让它工作了 - 有几处错误:
我需要将 'id' 添加到第一个 select 控件,以便我可以捕获它的更改事件:
{{> afQuickField name="elementId" id="elementId" options=elements}}
然后我使用了一个 Reactive Dict 变量,然后在更改的事件中设置它。会话变量可能会做同样的工作。
Template.processFormTemplate.events({
'change #elementId': function() {
dict.set('activeElementId', $('select#elementId').val());
}
});
并将其用作我的类别助手中的参数:
categories: function(elementId) {
return getFormCategories(dict.get('activeElementId'));
}
希望这对遇到类似问题的其他人有所帮助。
我之前遇到过同样的问题,我花了好几个小时才解决。您必须使用简单的模式来获取所选选项的值,就像这样使用自动表单的 api 调用 Autoform.getFieldValue:
Schemas.Store = new SimpleSchema({
center: {
type: String,
optional: true,
autoform: {
type: "select",
options: function () {
return Centers.find().map(function (c) {
return {label: c.name, value: c._id};
});
}
}
},
region: {
type: String,
optional: true,
autoform: {
type: "select",
options: function () {
if (Meteor.isClient) {
var docId = '';
docId = AutoForm.getFieldValue('storesForm', 'center');
return Regions.find({center: docId}).map(function (c) {
return {label: c.name + ' (' + c.code + ')', value: c._id};
});
}
}
}
},
store_name: {
type: String
}
});
顺便说一句,由于在 5.0
中使用 Autoform.getFieldValue 时遇到问题,我仍在使用 autoform@4.2.2我已经向 aldeed 报告了 5.0.3 中的问题:https://github.com/aldeed/meteor-autoform/issues/785#issuecomment-84600515