如何在不使用助手的情况下访问 Meteor 模板中的全局变量?

How to access global variables in Meteor template without using a helper?

我的所有图像文件都来自不同的域,我将该主机名作为变量放入 Meteor.settings。那么,如何在 Meteor 模板中访问这个变量?

例如,在此模板中,将 img.example.com 替换为 Meteor.settings 中定义的变量或其他一些全局变量的最佳做法是什么?我不认为使用助手将它传递给每个模板是个好主意。

<template name="products">
  {{#each items}}
    <img src="http://img.example.com/{{id}}.png">
  {{/each}}
</template>

在你的 Js 文件中这样做。它可能对你有帮助

Template.yourTemplateName.varNameYouhavetoaccess= function(){
    return getYourGlobalValueHere;
  }

并且在模板的 HTML 页面中,您可以迭代值 {{varNameYouhavetoaccess}}

或者您可以使用助手

在 JS 文件中:

Template.nametag.helpers({ 姓名:"Ben Bitdiddle" });

在HTML中:

<template name="nametag">
  <p>My name is {{name}}.</p>
</template>

将数据传递到模板的唯一方法是通过助手。您可以使用 global helper:

Template.registerHelper('imgExampleUrl', function() {
   return 'img.example.com';
});

那么你就可以在很多模板中使用global helper:

<template name="products">
  {{#each items}}
    <img src="http://{{imgExampleUrl}}/{{id}}.png">
  {{/each}}
</template>

<template name="otherTemplate">
    <img src="http://{{imgExampleUrl}}/{{id}}.png">
</template>

或者如果您想从 settings.json

获取 imgExampleUrl 的值
Template.registerHelper('imgExampleUrl', function() {
   return Meteor.settings.public.imgExampleUrl;
});

你的settings.json:

{
  "public": {
    "imgExampleUrl": "img.example.com"
  }
}

分配 return 类型的全局函数

if(Meteor.isClient){
 getItems = function(){
//do your stuffs
 return items;
}

您的模板

<template name="products">
    {{#each items}}
    <img src="http://{{imgExampleUrl}}/{{id}}.png">
  {{/each}}
</template>

助手

Template.products.helpers({
  items : function(){
    return getItems();
  }
});

您可以在任何地方使用getItems()

我知道这不是 op 所要求的,但在搜索 "How to access Meteor settings from template" 时,此页面出现在 Google。

我扩展了@Tomas Hromnik 的灵魂并制作了这个全局模板助手:

helpers.js

Template.registerHelper('meteorSettings', function(settings) {
  var setting = Meteor.settings.public;
  if (settings) {
    var eachSetting = settings.split('.');
    for (i = 0; i < eachSetting.length; i++) {
      setting = setting[eachSetting[i]];
    }
  }
  return setting;
});

home.html

<template name="home">
  <!--
    Basically the same as doing this: (except you can't do this)
    {{#if Meteor.settings.public.instagram.access_token}}
  -->
  {{#if (meteorSettings 'instagram.access_token')}}
    <div class="instagram"></div>
  {{/if}}

  <!--
    You can also set Meteor.settings.public to a variable to access multiple settings
  -->
  {{#let settings=meteorSettings}}
    {{settings.instagram.access_token}}
  {{/let}}
</template>
Template.registerHelper('var', name => {
  const data = Template.instance().data || {};
  return data[name];
});

内部模板:

{{var 'someVariableFromTemplate'}}