【问题标题】:Meteor Blaze HTML: conditional templates inside each loopMeteor Blaze HTML:每个循环内的条件模板
【发布时间】:2014-11-06 00:56:21
【问题描述】:

我有 3 个人,每个人对同一个问题都有不同的答案。

1 模板显示名称和问题。另一个不同的模板给出了答案。 (总共 4 个模板。1 个用于名称/问题,3 个其他 - 每个唯一答案 1 个)。

<template name="people">

  {{#each profile }}

    <h2>{{ name }}</h2>
    <p>{{ question }}</p>    

    <p>{{> answer }}</p> 

  {{/each }}

</template>

我想设置一个帮助程序,这样当每个profile 循环运行时,我可以插入正确的命名模板(而不是{{&gt; answer }},3 个不同的模板由它们的名称{{&gt; nameAnswers }} 标识,又名@987654325 @。

试过这个,它在每个 profile 中显示所有 3 个,而不是在每个 profile 中显示 1 个。

<template name="people">

  {{#each profile }}

    <h2>{{ name }}</h2>
    <p>{{ question }}</p>              

            {{#if nameHelper=Fred }}  
              {{> fredAnswers }}
            {{/if }}

            {{#if nameHelper=Ringo }}  
              {{> ringoAnswers }}
            {{/if }}  

            {{#if nameHelper=Jackson }}  
              {{> jacksonAnswers  }}
            {{/if }} 
  {{/each }}

</template>

注意:{{&gt; nameAnswers }}模板已经定义为静态html,需要插入就可以了。

【问题讨论】:

    标签: meteor handlebars.js meteor-blaze spacebars


    【解决方案1】:

    {{#if nameHelper=Fred }} 测试Spacebars.kw({nameHelper: view.lookup("Fred")}) 是否为真,它是真的,因为它是一个对象。这就是所有三个都出现的原因。

    看起来您有一个帮助器nameHelper,它返回一个字符串。您可以改用返回模板的帮助程序。假设是这样的:

    Template.people.nameHelper = function () {
        // return 'Fred', 'Ringo', or 'Jackson'
    };
    
    Template.people.chooseAnswerTemplate = function () {
        return {
            'Fred': Template.fredAnswers,
            'Ringo': Template.ringoAnswers,
            'Jackson': Template.jacksonAnswers
        }[Template.people.nameHelper.call(this)];
    };
    

    在您的people 模板中,

    <template name="people">
        {{#each profile }}
            ...
            {{> chooseAnswerTemplate}}
        {{/each }}
    </template>
    

    【讨论】:

    • [Template.people.nameHelper.call(this)] 对具有名称/模板的对象有什么影响?谢谢。
    • 它只是查找密钥Template.people.nameHelper.call(this),从而返回其中一个模板。????答案值
    • 包含动态计算模板的更清晰的方法是使用{{&gt; Template.dynamic template=chooseAnswerTemplate }} - ref
    【解决方案2】:

    您不能像这样使用= 运算符测试相等性。为此,您需要定义一个助手,例如:

    UI.registerHelper('equals', function(a, b) {
      return a == b; // == intentional
    };
    

    然后你就可以使用它了:

    {{#if equals nameHelper 'Ringo'}}  
      {{> ringoAnswers}}
    {{/if}}
    

    【讨论】:

      【解决方案3】:

      你可以这样做...

      使用 Blaze

      https://github.com/meteor/meteor/wiki/Using-Blaze

      <template name="people">
      
        {{#each profile }}
      
          <h2>{{ name }}</h2>
          <p>{{ question }}</p>              
      
                  {{#if isName Fred }}  
                    {{> fredAnswers }}
                  {{/if }}
      
                  {{#if isName Ringo }}  
                    {{> ringoAnswers }}
                  {{/if }}  
      
                  {{#if isName Jackson }}  
                    {{> jacksonAnswers  }}
                  {{/if }} 
        {{/each }}
      
      </template>
      
      
      Template.people.helpers({
          isName:function(name){
             return //true or false;
          }
      })
      

      【讨论】:

      猜你喜欢
      • 2016-03-17
      • 2017-12-07
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多