【问题标题】:Accessing parent helper in Meteor在 Meteor 中访问父助手
【发布时间】:2015-06-18 18:10:09
【问题描述】:

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

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

<template name="MainTemplate">
  <div>{{> FirstTemplate}}</div>
  <div>{{> SecondTemplate}}</div>
  <div>{{> ThirdTemplate}}</div>
  <div>{{> FourthTemplate}}</div>
</template>

现在这些模板中的每一个都想使用相同的助手,我们称之为dataHelper

Template.MainTemplate.helpers({
  dataHelper: function() {
    //do some stuff
    return result
  }
})

遗憾的是,无法通过简单地键入 {{dataHelper}} 来访问模板中的第一个到第四个帮助程序,就像事件的工作方式一样。

我的解决方案是创建一个全局助手,但这似乎有点过头了,特别是因为我有几个页面根本不关心这些助手。另一种解决方案是创建四个单独的助手,但是,嘿,干。

我在这里遗漏了一些简单的东西吗?

【问题讨论】:

  • 你真的需要重用一个函数(例如formatDate)并用新数据调用它,还是你只需要一些共享上下文?我认为在问题中举一个更具体的例子会更容易回答。
  • @DavidWeldon 不涉及数据,只是访问父助手。

标签: javascript meteor


【解决方案1】:

在当前版本的流星中没有明显的方法可以做到这一点。一种解决方案是让子模板从父模板“继承”助手。您可以使用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>

js

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

Template.child.inheritsHelpersFrom('parent');

模板child 继承了其父级的所有助手,因此它可以直接访问saySomething

这种技术有两个缺点:

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

【讨论】:

  • 那会重新初始化吗?
【解决方案2】:

您可以使用带有两个点的{{yourParentHelper ..}} 之类的符号来访问您的父助手。 Have a look here了解更多信息(文末)

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

var parent_data = Template.parentData();

对了,你可以添加一个参数到达第三个父级,例如:

var parent_data = Template.parentData(3);

【讨论】:

  • 这个符号让我的整个页面停了下来,什么都不会加载。
  • 请在您的问题中发布更多详细信息。 AFAIK 应该可以。您是否尝试构建一个与您想要访问的帮助器类似的帮助器并使用Template.parentData(); 来访问父上下文中的内容?
  • 我所做的只是尝试一下。我在父模板中包含了一个助手,它只是将一些内容写入控制台,然后尝试使用{{dataHelper ..}} 访问它。大停顿。
  • 目前无法测试。它可能不再起作用了。你会尝试使用 javascript 吗?
  • 使用javascript?这是什么意思?
【解决方案3】:

双点符号似乎在{{#each}} 循环中效果最好,而我在实际的子模板中没有任何运气。一种选择是使用{{#with}},尽管这基本上将您限制为一个助手。例如:

<template name="parent">
  {{#with dataHelper}}
    {{> first}}
    {{> second}}
  {{/with}}
</template>

这会将子助手的数据上下文设置为dataHelper,您可以在模板中使用{{this}} 访问它们。我想您可以将dataHelper 设为一个对象,然后以这种方式传入多条数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 2015-01-29
    • 2013-02-14
    • 1970-01-01
    • 2013-06-18
    • 2016-03-04
    • 2015-03-28
    • 2014-09-26
    相关资源
    最近更新 更多