63

我一直在用 Meteor 进行实验,但遇到了一些我无法弄清楚的事情。为了好玩,我试图制作一台老虎机。我有以下 HTML:

<div class="slot-wrapper">
  {{> slot}}
  {{> slot}}
  {{> slot}}
</div>

<template name="slot">
  <div class="slot">
    <div class="number"><span>{{ number }}</span></div>
    <div class="divider"></div>
  </div>
</template>

我想为每个插槽设置不同的号码。是否可以将变量传递给模板?像这样的东西:

<div class="slot-wrapper">
  {{> slot 1}}
  {{> slot 2}}
  {{> slot 3}}
</div>

<template name="slot">
  <div class="slot">
    <div class="number"><span>{{ number i}}</span></div>
    <div class="divider"></div>
  </div>
</template>

也许我正在以错误的方式思考这个问题,并且有更好的方法。

4

9 回答 9

94

以前的所有答案都是矫枉过正或过时的。从 Meteor 0.8.x 开始,您可以直接从 HTML+空格键代码将静态参数传递到模板中:

<div class="slot-wrapper">
  {{> slot number="1"}}
  {{> slot number="2"}}
  ...
</div>

<template name="slot">
  <div class="number"><span>{{number}}</span></div>
</template>

您所要做的就是key="value"{{> template}}包含调用中传递参数:

{{> slot number="1"}}

在Spacebars Secrets: Exploring Meteor Templates中了解更多信息。


如果您想将调用者模板的数据传递给子/嵌套/被调用模板,请执行以下操作:不传递任何内容。相反,从嵌套模板访问父数据上下文../

<div class="slot-wrapper">
  {{> slot number="1"}}
  {{> slot number="2"}}
  ...
</div>

<template name="slot">
  <div>Machine name: {{../name}}</div>
  <div class="number"><span>{{number}}</span></div>
</template>
于 2014-08-01T23:26:26.683 回答
14

原来还有另一种方式。

我试图通过谷歌搜索各种搜索来找出如何做到这一点,并找到了这个问题,但没有任何适合我的目的。除非您想将嵌套模板放在父模板中的不同位置,否则 TomUnite 的答案有效。

因此,经过大量搜索,我在流星代码库中找到了“一个”答案。(不是说这是确定的答案,但确实有效)

<template name="slots">
  {{> slot one}}
  <div>..something else</div>
  {{> slot three}}
  {{> slot two}}
</template>

<template name="slot">
  <div class="slot">
    <div class="number"><span>{{number}}</span></div>
    <div class="divider"></div>
  </div>
</template>

如您所见,我们可以按任何顺序指定模板实例。第二个参数实际上是一个应该定义的变量,所以:

Template.slots.one = {
  number: 1
}
Template.slots.two = {
  number: 2
}
Template.slots.three = {
  number: 3
}

这可以通过循环或在 slot 对象上使用 underscore.js 函数 _.extend 制成更简洁的代码。此外,我们可以将多个数据字段传递到这些对象中。

于 2012-10-28T09:59:19.147 回答
9

我想将此作为评论留下,因为这只是对 Joc 答案的澄清,但不能,所以这里加上我使用的示例。

只能将一个参数传递给模板:

{{> singleItemInfo arg1}}

此参数必须是一个对象,例如:

{
    number: 1,
    number2: 2,
    numberComposite: {
        subnum1: 10,
        subnum2: 20
    }
};

可以通过它们的键访问参数值,并且可以切换范围以获取具有

{{#with numberComposite}}

这是示例的完整代码:

<html文件>

<body>
    {{ itemsView }}
</body>

<template name="itemsView">
    {{> singleItemInfo arg1}}
</template>

<template name="singleItemInfo">
    arg1 = {{ number }}
    arg2 = {{ number2 }} 
    {{#with numberComposite}}
        subArg1 = {{ subnum1 }}
        subArg2 = {{ subnum2 }}
    {{/with}}
</template>

<javascript 文件>

Template.itemsView.arg1 = {
    number: 1,
    number2: 2,
    numberComposite: {
        subnum1: 10,
        subnum2: 20
    }
};

输出:

arg1 = 1 arg2 = 2 subArg1 = 10 subArg2 = 20 
于 2012-11-02T02:47:28.423 回答
5

更好的答案:

在新的 Blaze 布局下可用于使模板上下文敏感的两种解决方案是:

1)直接将参数传递给模板

{{> contextSensitiveTemplate  context_1='x' context_2='y' }}

2)在模板中使用理解上下文的助手。像这样调用助手:

{{ contextHelperName ../.. .. this }}

Template.contextSensitiveTemplate.contextHelperName = function(parent_template, current_template, current_value_inside_each_loop) {
  return context_dependent_value_or_html     
}
于 2014-08-04T09:53:46.910 回答
3

这就是我为实现它所做的。我对 Meteor 还很陌生,所以可能有更好的方法:

插槽.html:

<head>
  <title>Slot</title>
</head>

<body>
  <div class="slot-wrapper">
    {{> slots}}
  </div>
</body>

<template name="slots">
  {{#each slots}}
    {{> slot}}
  {{/each}}
</template>

<template name="slot">
  <div class="slot">
    <div class="number"><span>{{number}}</span></div>
    <div class="divider"></div>
  </div>
</template>

插槽.js:

if (Meteor.is_client) {
  Template.slots.slots = function () {
    var returnArray = new Array();
    returnArray[0] = { 'number': 10 };
    returnArray[1] = { 'number': 87 };
    returnArray[2] = { 'number': 41 };
    return returnArray;
  };
}

if (Meteor.is_server) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}

希望这对您有所帮助!

于 2012-04-12T17:57:18.233 回答
2

我通常使用这两个 Handlebars 助手:

Handlebars.registerHelper('partial', function(templateName, options) {
    return new Handlebars.SafeString(Template[templateName](options.hash));
});

Handlebars.registerHelper('partialWithContext', function(templateName, context, options) {
    var extendedContext = _.extend(context, options.hash);
    return new Handlebars.SafeString(Template[templateName](context));
});

您可以像这样使用它(假设您有一个名为 的模板menuItem):

{{partial 'menuItem' command='Open'}}

或者在迭代中(假设您有一个名为 的模板userProfile):

{{#each regularUsers}}
    {{partialWithContext 'userProfile' . isAdmin=false}}
{{/each}}

{{#each admins}}
    {{partialWithContext 'userProfile' . isAdmin=true}}
{{/each}}

使用空格键,您可以实现类似的行为。在partial.js

Template.partialWithContext.chooseTemplate = function (name) {
    return Template[name];
};

partial.html

<template name="partialWithContext">
    {{#with chooseTemplate name}}
        {{#with ../data}}
            {{> ..}}
        {{/with}}
    {{/with}}
</template> 

像这样使用它:

{{#each commands}}
    {{> partialWithContext name="commandListItem" data=this isAdmin=false}}
{{/each}}
{{#each adminCommands}}
    {{> partialWithContext name="adminCommandListItem" data=this isAdmin=true}}
{{/each}}

希望它能起到作用。

于 2014-02-04T20:29:27.350 回答
2

this当你只传递一个参数时使用。

<div class="slot-wrapper">
    {{> slot 1}}
    {{> slot 2}}
</div>

<template name="slot">
    <div class="slot">
        <div class="number"><span>{{this}}</span></div>
        <div class="divider"></div>
    </div>
</template>

不需要javascript来做到这一点。如果您需要的不仅仅是争论,请尝试 Dan 的方式。

于 2015-06-17T18:44:08.110 回答
0

此信息已过时,此处详细描述了 Blaze 布局引擎的传递参数: https ://www.discovermeteor.com/blog/spacebars-secrets-exploring-meteor-new-templating-engine/

于 2014-07-23T10:04:30.653 回答
0

这里有很多很好的信息。我的具体情况是我也想传入一些模板数据。

我想让子 Blaze 组件可重用,所以必须传入所有数据。例如,假设这个组件显示一个等级(即 A、B、C 等)。在一个页面上,我想使用该组件两次:你的成绩和你同学的平均成绩。

这是子组件...

等级.html

<template name="Grade">
    <h3>{{title}}</h3>
    <div>{{grade}}</h3>
</template>

标题可以在父级中硬编码,但成绩来自分贝。这是我对父母进行编码的方式...

GradePage.html

<template name="GradePage">
    {{> Grade grade=gradeYours title="Your Grade" }}
    {{> Grade grade=gradeClass title="Class Grade" }}
</template>

GradePage.js(在现实生活中它是反应式的,但在这里简化了)

Template.GradePage.helpers({
    gradeYours: function () {
        return 'A-';
    },
    gradeClass: function () {
        return 'B+';
    }
});

就是这样。子组件根本不需要伸手去获取它的值。

于 2016-05-16T00:57:11.653 回答