【问题标题】:Meteor templates. How can I not render a HTML element based on an {{#if}}?流星模板。如何不渲染基于 {{#if}} 的 HTML 元素?
【发布时间】:2016-02-26 07:12:33
【问题描述】:

我有一个存储公司电话号码的集合。 如果一家公司有电话号码,请画出这些电话号码。 如果公司没有电话号码,就不要画。

目前它只工作了一半。如果集合中没有号码,它不会绘制电话号码,但它仍然会绘制 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 })
    }

});

如果集合没有返回数据,我怎样才能让它不绘制

Phone

【问题讨论】:

    标签: mongodb if-statement meteor spacebars


    【解决方案1】:

    简短回答

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

    长答案

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

    假设您在当前上下文中有一个post 文档。每个postmodeled 都有一个fetchAuthor 帮助器,它返回一个用户文档。假设您需要作者姓氏的小写版本。在 JavaScript 中,您可以编写如下内容:

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

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

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

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

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

    【讨论】:

    • 哇,我不知道。我从来没有在文档中遇到过!是时候清理一下代码了!
    • 是的,很遗憾这并不为人所知。我发现这是减少渲染模板所需的助手数量的好方法。
    • 更新了我所有的代码以使用这种模式,谢谢大卫!
    【解决方案2】:

    我很早就遇到了这个问题,这是一个简单的方法,您可以从帮助程序返回一个包含计数的对象:

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

    【讨论】:

    • 谢谢@Michel Floyd,非常简洁明了。非常感谢。
    • 嗨@robster - 您应该将 David Weldon 的答案标记为正确答案,它更加优雅。
    【解决方案3】:

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

    <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() 助手/方法是否为真。如果是这样,它使用 each 迭代器来渲染项目列表,else - 显示没有数字的消息。

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

    【讨论】:

    • 很好的答案,谢谢。我正在为@Michel Floyd 提供解决方案,但为了简化由他的代码产生的模板。这也是完全正确的。再次感谢,我一直在学习像你这样的好答案。罗伯
    • 随意选择适合您的任何解决方案。我试图牢记效率并消除不必要的游标提取。这就是我使用#with 的原因(否则你有两个不同的地方,内部依赖于外部)。我所做的其他更改是从列表中删除 h4 并使用 count() 助手(正如大卫在他的回答中指出的那样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多