访问Meteor中的父助手

Yea*_*ats 6 javascript meteor

我经常发现自己将我的工作划分为仍然可以使用相同助手的模板.

所以,说我有这个模板结构:

<template name="MainTemplate">
  <div>{{> FirstTemplate}}</div>
  <div>{{> SecondTemplate}}</div>
  <div>{{> ThirdTemplate}}</div>
  <div>{{> FourthTemplate}}</div>
</template>
Run Code Online (Sandbox Code Playgroud)

现在每个模板都想使用相同的帮助器,让我们称之为dataHelper:

Template.MainTemplate.helpers({
  dataHelper: function() {
    //do some stuff
    return result
  }
})
Run Code Online (Sandbox Code Playgroud)

遗憾的是,只需键入{{dataHelper}}事件的工作方式,就无法在第一到第四个模板中访问此帮助程序.

我的解决方案是创建一个全局帮助器,但这似乎有点过分,特别是因为我有几个页面根本不关心这些帮助器.另一种解决方案是创建四个独立的助手,但是,嘿,DRY.

我错过了一些简单的东西吗?

Bil*_*net 5

您可以使用{{yourParentHelper ..}}两个点之类的表示法访问您的父助手.在这里查看更多信息(文章末尾)

您还可以在javascript中访问父数据上下文:

var parent_data = Template.parentData();
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您可以添加一个参数来到达第三个父级,例如:

var parent_data = Template.parentData(3);
Run Code Online (Sandbox Code Playgroud)


Dav*_*don 5

在当前版本的流星中没有明显的方法可以做到这一点.一种解决方案是让子模板从父级"继承"帮助程序.您可以使用meteor-template-extension轻松完成此操作.这是一个例子:

HTML

<body>
  {{> parent}}
</body>

<template name="parent">
  <h1>parent</h1>
  {{> child}}
</template>

<template name="child">
  <h2>child</h2>
  <p>{{saySomething}}</p>
</template>
Run Code Online (Sandbox Code Playgroud)

JS

Template.parent.helpers({
  saySomething: function() {
    return Random.choice(['hello', 'dude!', 'i know right?']);
  }
});

Template.child.inheritsHelpersFrom('parent');
Run Code Online (Sandbox Code Playgroud)

模板child继承了其所有父级的帮助程序,因此可以直接访问saySomething.

这种技术有两个缺点:

  • 你必须指定inheritsHelpersFrom关系
  • 所有父母的助手都是继承的