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

Posted

技术标签:

【中文标题】如何在不使用帮助器的情况下访问 Meteor 模板中的全局变量?【英文标题】:How to access global variables in Meteor template without using a helper? 【发布时间】:2015-07-02 14:25:58 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:
Template.registerHelper('var', name => 
  const data = Template.instance().data || ;
  return data[name];
);

内模板:

var 'someVariableFromTemplate'

【讨论】:

虽然这可能会回答这个问题,但最好解释一下答案的基本部分,以及 OP 代码可能存在什么问题。【参考方案2】:

我知道这不是 op 所要求的,但是当搜索“如何从模板访问 Meteor 设置”时,这个页面出现在 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>

【讨论】:

【参考方案3】:

为全局函数分配返回类型

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()

【讨论】:

【参考方案4】:

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

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

然后你可以在很多模板中使用全局助手:

<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"
  

【讨论】:

如果没有像问题所问的那样的助手,你是怎么做的? ...例如,我不想用变量污染我的全局助手 将数据传递到模板的唯一方法是通过帮助程序。【参考方案5】:

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

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

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

或者你可以使用Helper

在JS文件中:

模板.nametag.helpers( 名称:“本·比特德尔” );

在 HTML 中:

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

【讨论】:

但是,这是否意味着我必须为将使用此变量的 每个 模板定义一个包装器或帮助器?这就是我要避免的。

以上是关于如何在不使用帮助器的情况下访问 Meteor 模板中的全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

C# - 如何在不使用索引器的情况下获取自定义集合的第一项?

Ruby Rspec:在不向源添加访问器的情况下测试实例变量

在不使用模板或框架的情况下使用 Phonegap 设置 Vue.js

谷歌文档如何在不使用 Flash 查看器的情况下显示我的 .PPT 文件?

在不使用上下文处理器的情况下访问 django 1.7 模板中的 URL 参数

在不使用定价服务作为推送器的情况下创建 Laravel 广播的最简单方法是啥?