Meteor/Blaze-参数中的简单字符串连接



我知道如何通过更扩展的、可能是"正确的"方法来实现这一点,但我想知道是否有更简单的方法可以做到这一点。

{{> alert message="My message"}}

基本上,我有一个模板,它的值为message。我想给它一个消息Logged in as: samanime,其中samanimecurrentUser.username的值。

我知道我可以通过创建一个助手来连接这两个部分来实现这一点,但有没有什么方法可以在没有额外助手的情况下实现呢?也许类似于:

{{> alert message="Logged in as: ${currentUser.username}"}}

在考虑了几个想法之后,我认为我已经想出了一个合理的解决方案,它不会(太多)违反视图和逻辑的分离。

首先,为了进行实际的串联,我制作了一个concat助手:

// Takes any number of arguments and returns them concatenated.
UI.registerHelper('concat', function () {
return Array.prototype.slice.call(arguments, 0, -1).join('');
});

示例用法:

{{ concat "a" "b" "c" }}
{{! output: "abc" }}

然后,我制作了一个新的块助手withResult:

助手:

UI.registerHelper('withResult', function () {
Template._withResult.helpers({result: this.valueOf()});
return Template._withResult;
});

模板:

<template name="_withResult">
{{> UI.contentBlock result=result}}
</template>

示例用法:

{{#withResult concat "a" "b" "c"}}
{{> alert message=result}}
{{/withResult}}

基本上,它获取块调用(在本例中为concat)的结果,并将其放入模板可用的变量result中。

我认为这是一种相当干净和灵活的方法,不仅可以进行concat,还可以获得其他简单的多参数值。在这一点上,唯一的负面影响是它只允许您创建一个变量(因为每个作用域都将其放在同一个位置)。但是,可以通过让其他辅助对象返回对象来克服这一问题。

当然,这是你不想滥用的东西,因为它会模糊我们试图在视图和逻辑之间保持的清晰界限。

最新更新