流星模板。我怎样才能不渲染基于 {{#if}} 的 HTML 元素?

Meteor templates. How can I not render a HTML element based on an {{#if}}?

我有一个 collection 存储公司的 phone 号码。 如果一家公司有 phone 个数字,请绘制这些 phone 个数字。 如果一家公司没有phone号码,请不要抽取。

目前已经成功了一半。如果 collection 中没有数字,它不会绘制 phone 数字,但它仍然绘制 < h4 >Phone 标题,我不希望它这样做。

代码如下:

<template name="orgPage">
    <h2>Organisation Name: {{name}}</h2>
    <h3>Contact Details</h3>
    <ul>
        {{#if phone}}
            <h4>Phone</h4>
            {{#each phone}}
                <li>{{number}} ({{type}})</li>
            {{/each}}
        {{else}}
            <p>No contact numbers</p>
        {{/if}}  
    </ul>
</template>

Template.orgPage.helpers({

    'phone': function() {
        return organisationsPhoneNumbers.find({ orgId: currentOrgId })
    }

});

如果 collection 没有返回数据,我如何让它不绘制

Phone

我很早就遇到过这个问题,这里有一个简单的方法,您可以 return 来自帮助程序的包含计数的对象:

js:

Template.orgPage.helpers({
  'phone': function() {
    var cursor = organisationsPhoneNumbers.find({ orgId: currentOrgId });
    return { count: cursor.count(), items: cursor };
  }
})

html:

 {{#if phone.count}}
   <h4>Phone</h4>
   {{#each phone.items}}
     <li>{{number}} ({{type}})</li>
   {{/each}}
 {{/if}}

这种场景有一个相当标准的模式,可以避免多次重新运行同一个助手:

<template name="orgPage">
    <h2>Organisation Name: {{name}}</h2>
    <h3>Contact Details</h3>
    {{#with phone}}
      {{#if count}}
        <h4>Phone</h4>
        <ul>
          {{#each .}}
            <li>{{number}} ({{type}})</li>
          {{/each}}
        </ul>
      {{else}}
        <p>No contact numbers</p>
      {{/if}}  
    {{/with}}
</template>

with 块将其内容的范围设置为 phone 助手的结果,它是一个游标。

然后检查 if count() helper/method 是否为真。如果是这样,它使用 each 迭代器来呈现项目列表,else - 显示没有数字的消息。

请注意,如果您不需要 each 块之外的任何内容,则可以使用 each...else 子句。

简答

保留所有原始代码并将 {{#if phone}} 替换为 {{#if phone.count}}

长答案

空格键有一个非常酷的 path evaluation 功能,最好用一个例子来解释。

假设您在当前上下文中有一个 post 文档。每个 postmodeled 有一个 fetchAuthor 助手,其中 returns 一个用户文件。假设您需要作者姓氏的小写版本。在 JavaScript 你可以这样写:

post.fetchAuthor().profile.firstName.toLowerCase()

现在如果我们需要模板中的值,我们可以这样写:

{{post.fetchAuthor.profile.firstName.toLowerCase}}

当空格键评估路径中的每个标识符时,它会检查它是否是一个函数 - 如果是,它会调用它。请注意,这仅在被调用函数不带参数时才有效。

回到我们原来的例子,phone 助手 returns 游标,它有一个 count 功能。我们可以写 {{#if phone.count}},空格键会弄清楚我们的意思是 phone.count(),因为 count 是一个函数。