我是否在代码中出错或者是否在autoform或Meteor中发现了错误?我坚信这是我的错误,但找不到它。
在我的Meteor应用程序中查询集合以提供表单中选择输入字段的值时,服务器上运行的函数返回正确填充的数组,但在客户端上运行时返回空数组。
该应用程序将跟踪医学研究科目。我有研究和研究赞助商的收藏。在创建或编辑研究时,我想从现有赞助商名单中输入研究赞助商。 Autoform和simple-schema用于创建创建和编辑表单。研究赞助商名称的选择输入在研究模式中提供名称,作为给予'allowedValues'的数组。当赋予allowedValues显式数组时,所有数据都按预期工作。但是,当数组由函数
提供时sponsorNames = function(){
sn = Sponsors.find().map(function(sp){ return sp.sponsorname });
console.log(sn);
return sn;
};
从Sponsors集合收集数组值,生成的列表为空。
sponsorNames函数中的console.log语句将填充的数组打印到我运行应用程序的cli。但是,浏览器控制台在同一个console.log语句中显示一个空数组。我相信代码在服务器和客户端都运行,产生两种不同的结果。在所有其他方面,代码都应该运行。
缩写申请结构:
research
both
collections
sponsors.js
studies.js
router
routes.js
client
sponsor
events.js
helpers.js
templates.html
study
events.js
helpers.js
templates.html
subscribe.js
server
methods.js
publish.js
security.js
两者/集合/ sponsors.js
Sponsors = new Meteor.Collection('sponsors');
Schema.Sponsors = new SimpleSchema({
sponsorname: {
type: String,
label: 'Sponsor Name'
},
});
Sponsors.attachSchema(Schema.Sponsors);
两者/集合/ studies.js
Studies = new Meteor.Collection('studies');
sponsorNames = function(){
sn = Sponsors.find().map(function(sp){ return sp.sponsorname });
console.log(sn);
return sn;
};
Schema.Studies = new SimpleSchema({
studyname: {
type: String,
label: 'Study Name'
},
sponsor: {
type: String,
label: 'Sponsor',
allowedValues: sponsorNames(),
},
sitenum: {
type: String,
label: 'Site Number'
},
});
Studies.attachSchema(Schema.Studies);
客户端/研究/ templates.js
<template name='editStudy'>
{{#autoForm collection=studies id="updateStudyForm" type="update" doc=doc}}
<fieldset>
<legend>Edit a Study</legend>
{{> studyPanel1}}
</fieldset>
<button type="submit" class="btn btn-primary">Update</button>
{{/autoForm}}
</template>
<template name='studyPanel1'>
{{> afQuickField name="studyname" class="form-control input"}}
{{> afQuickField name="sponsor" class="form-control input" options='allowed' }}
{{> afQuickField name="sitenum" class="form-control input"}}
</template>
客户端/研究/ helpers.js
Template.addStudy.helpers({
studies: function(){
return Studies;
},
});
Template.editStudy.helpers({
studies: function(){
return Studies;
},
doc: function(){
return this;
}
});
客户端/研究/ events.js
var sponsorHooksObject = {
after: {
insert: function(error, result) {
if (!error) {
Router.go('sponsorsPage');
};
},
update: function(error, result) {
if (!error) {
Router.go('sponsorsPage');
};
}
},
};
AutoForm.hooks({
insertSponsorForm: sponsorHooksObject,
updateSponsorForm: sponsorHooksObject
});
的客户机/ subscribe.js
Meteor.subscribe('Subjects');
Meteor.subscribe('Studies');
Meteor.subscribe('Sponsors');
服务器/ methods.js
Meteor.methods({
'removeSubjectData': function(id){
Subjects.remove(id);
},
'removeStudyData': function(id){
Studies.remove(id);
},
'removeSponsorData': function(id){
Sponsors.remove(id);
},
});
服务器/ publish.js
Meteor.publish('Subjects', function(){
return Subjects.find({});
});
Meteor.publish('Studies', function(){
return Studies.find({});
});
Meteor.publish('Sponsors', function(){
return Sponsors.find({});
});
服务器/ security.js
Subjects.permit(['insert', 'update', 'remove']).apply();
Studies.permit(['insert', 'update', 'remove']).apply();
Sponsors.permit(['insert', 'update', 'remove']).apply();
流星列表:
accounts-password 1.1.1
alanning:roles 1.2.13
aldeed:autoform 5.3.2
aldeed:collection2 2.3.3
aldeed:simple-schema 1.3.3
aslagle:reactive-table 0.8.9
email 1.0.6
fortawesome:fontawesome 4.3.0
ian:accounts-ui-bootstrap-3 1.2.71
iron:router 1.0.9
meteor-platform 1.2.2
ongoworks:security 1.2.0
reactive-var 1.0.5
twbs:bootstrap 3.3.5
答案 0 :(得分:1)
我只是想弄错了。赞助商名称填写选择字段的赞助商集合的查询属于模板助手。通过这些更改,应用程序可以正常工作。
两者/集合/ studies.js
Studies = new Meteor.Collection('studies');
// Remove these:
// sponsorNames = function(){
// sn = Sponsors.find().map(function(sp){ return sp.sponsorname });
// console.log(sn);
// return sn;
// };
Schema.Studies = new SimpleSchema({
studyname: {
type: String,
label: 'Study Name'
},
sponsor: {
type: String,
label: 'Sponsor',
// Remove this:
// allowedValues: sponsorNames(),
},
sitenum: {
type: String,
label: 'Site Number'
},
});
Studies.attachSchema(Schema.Studies);
客户端/研究/ templates.js
<template name='editStudy'>
{{#autoForm collection=studies id="updateStudyForm" type="update" doc=doc}}
<fieldset>
<legend>Edit a Study</legend>
{{> studyPanel1}}
</fieldset>
<button type="submit" class="btn btn-primary">Update</button>
{{/autoForm}}
</template>
<template name='studyPanel1'>
{{> afQuickField name="studyname" class="form-control input"}}
{{> afQuickField name="sponsor" class="form-control input"
type='select' options=sponsorNames }} <!-- Add this: -->
{{> afQuickField name="sitenum" class="form-control input"}}
</template>
客户端/研究/ helpers.js
Template.addStudy.helpers({
studies: function(){
return Studies;
},
});
Template.editStudy.helpers({
studies: function(){
return Studies;
},
doc: function(){
return this;
}
});
// Add this:
Template.registerHelper("sponsorNames", function() {
return Sponsors.find().map(function(sp){
return {label: sp.sponsorname, value: sp.sponsorname};
});
});
答案 1 :(得分:0)
赞助商名称在客户端返回一个空数组是正确的,这是因为在订阅准备好之前调用了该函数。我想知道你是否可以做这样的事情(未经测试):
Studies = new Meteor.Collection('studies');
Tracker.autorun(function () {
sn = Sponsors.find().map(function(sp){ return sp.sponsorname });
Schema.Studies = new SimpleSchema({
studyname: {
type: String,
label: 'Study Name'
},
sponsor: {
type: String,
label: 'Sponsor',
allowedValues: sn,
},
sitenum: {
type: String,
label: 'Site Number'
},
});
Studies.attachSchema(Schema.Studies, { replace: true });
});
解释:
每当任何依赖项失效时,Tracker.autorun都会重新运行代码。这里的依赖是Sponsors.find()查询,所以一旦订阅加载Sponsors.find()的结果将改变,跟踪器函数将重新运行。
使用replace:true
附加架构将每次都替换整个架构,因此allowedValues: []
将替换为新的赞助商阵列。