使用流星集合预先填充应用程序设置

时间:2014-01-15 11:28:49

标签: collections meteor

我正试图绕着流星的方式工作。 我正在构建一个网站原型,我想用site.title, site.logo, site.contact.number等数据预先填充它...

我创建了一个Settings集合:

Settings = new Meteor.Collection('settings');
Settings.insert(
  {
  logo: 'test logo',
  contact: {
    human: '01 01 01 01 01',
    machine: '0101010101'
  }
}
)

是否可以在html标记中跨模板检索此数据,因为Meteor订阅了该集合?

我正在尝试做以下事情:

    <a href="#" class="logo url" rel="me">{{settings.logo}}</a>
    <a href="{{settings.contact.machine}}" class="logo url" rel="me" {{settings.contact.human}}</a>

Meteor目前正在自动发布,因此我不确定是否需要在main.js文件中执行某些操作。 Meteor可以自动访问所有值吗?目前它打印[object,object]

<小时/>

更新

我创建了一个settings.json文件:

{
  "public" : {
    "logo" : "my fancy company name",
    "contact" : {
      "human" : "01 01 01 01 01 ",
      "machine" : "0044101010101"
    }
  }
}

然后我将Handlebars.registerHelper更改为

Handlebars.registerHelper('view', function(){
  return Meteor.settings.public
});

我现在可以访问所有设置而无需为它们创建集合,更容易。
欢呼声

1 个答案:

答案 0 :(得分:1)

你的方法在几个层面都是错误的。

车把表达式{{settings.contact.machine}}会将*currentContextObject*.settings.contact.machine插入HTML,其中*currentContextObject*是模板的数据上下文。

您的模板的数据上下文是什么?我不知道,但这并不重要,因为settings.contact.machine无论如何都没有意义。 Settings是一组文档,但您尝试将其用作单个对象。

JS中有用的是Settings.findOne().contact.machine。要跨模板访问此设置,您需要创建一个全局模板帮助程序,例如:。

if (Meteor.isClient) {
  Handlebars.registerHelper("getMachineContact", function() {
    return Settings.findOne().contact.machine;
  });
} 

然后您可以在HTML中使用{{getMachineContact}}

这个解决方案仍然不太好,你应该使用Meteor.settings而不是Settings集合来解决你的用例。

here类似,您可以创建一个全局模板助手,在给定路径的情况下从Meteor.settings返回任意值,这意味着您可以编写{{getSetting "contact.machine"}}。这种方法涉及将点符号(“contact.machine”)中的字符串转换为对象引用,因此this问题可能有用。