查询Meteor集合以获取afQuickField选择的值失败。为什么呢?

时间:2015-07-13 13:27:47

标签: javascript mongodb meteor meteor-autoform

我是否在代码中出错或者是否在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

2 个答案:

答案 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: []将替换为新的赞助商阵列。