【问题标题】:How to pass Meteor Spacebars helper with parameter into another helper attribute?如何将带有参数的 Meteor Spacebars 助手传递给另一个助手属性?
【发布时间】:2015-12-10 06:46:51
【问题描述】:

每个人 :) 例如我有这样的事情:

{{> someCoolHelper
 someParam1='someVal1'
 someParam2='someVal2'
 someParam3='SomeVal3'
 someParam4=someAnotherHelper 'value param to this helper'
}}

所以我有一个函数,它根据可以传递的参数计算一些值。那么我该怎么做呢?

【问题讨论】:

    标签: meteor meteor-blaze spacebars meteor-helper


    【解决方案1】:

    正如您可能在 meteor forum 的论坛帖子中看到的那样,这在空格键中是不可能的。

    我们从一个用于链接方法和参数的新包开始,但它尚未发布。您可以做的是使用WITH 元素,如

    取而代之的是:

    {{> someCoolHelper
      someParam1='someVal1'
      someParam2='someVal2'
      someParam3='SomeVal3'
      someParam4=someAnotherHelper 'value param to this helper'
    }}
    

    可以通过以下方式管理:

    {{#with someAnotherHelper 'value param to this helper' }}
      {{> someCoolHelper
        someParam1='someVal1'
        someParam2='someVal2'
        someParam3='SomeVal3'
        someParam4=this
      }}
    {{/with}}
    

    我不喜欢,但有时是必要的

    汤姆

    P.S.:或者放弃空格键并使用 React - 你不会有这样的限制。

    【讨论】:

    • 感谢您的回答,但我的项目中还有一些其他情况。使用您的变体,此代码块仅在“#with”条件下存在某些值时才有效。在我的情况下,另一个助手将返回的值可以为空(长度为零的数组,假,例如)
    • 它不会变得更好,但您可以在外面使用 {{if}} 语句,这样您就可以确定 #with 会得到一个值,否则在 {{else}} 语句中。抱歉,那是空格键。
    • #with 现在已贬值,因为它会更新上下文。现在使用#let
    【解决方案2】:

    在模板子表达式在空格键中可用之前的占位符解决方案是创建一个帮助器,在 JS 中返回足够的值:

    HTML

    {{> myTemplate param1="A" param2=param2}}
    

    JS

    function someOtherHelper(param){
      console.log(param);
    }
    
    Template.registerHelper("someOtherHelper", someOtherHelper);
    
    Template.myTemplate.helpers({
      param2: function(){
        return someOtherHelper("B");
      }
    });
    

    【讨论】:

    • 据我了解您的问题,您正在寻找一种(动态)解决方案,该解决方案主要在模板源中完成,而不是使用 return someOtherHelper("B") 等特殊调用编写许多包装函数。对吗?
    【解决方案3】:

    您可以使用括号将助手的输出传递给另一个助手。很确定这就是你所追求的: http://blazejs.org/guide/spacebars.html#Calling-helpers-with-arguments

    您还可以将帮助程序的输出传递给模板包含或其他帮助程序。为此,请使用括号显示优先级:

    {{> Todos_item (todoArgs todo)}}
    

    这里将 todo 作为参数传递给 todoArgs 助手,然后将输出传递到 Todos_item 模板。

    我在最近的一个项目中使用此功能允许将 CSS 类有条件地渲染到组件(为简洁起见):

    # global helper to provide ternary operator
    Template.registerHelper('ternary', (condition, resultTrue, resultFalse) => {
      return condition ? resultTrue : resultFalse
    })
    
    # in my-template.js:
    Template.My_template.helpers({
      isComplete(score) {
        return score === 1
      }
    })
    
    # in my-template.html:
    {{> some_component class=(ternary (isComplete this.score) "green" "red")}}
    

    【讨论】: