首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJ中的多个$interpolation符号

AngularJ中的多个$interpolation符号
EN

Stack Overflow用户
提问于 2014-05-16 09:06:54
回答 2查看 238关注 0票数 0

我是AngularJs的新手,但我特别需要一个更复杂的、使用多个插值符号的条件模板。我使用的示例与https://docs.angularjs.org/api/ng/service/$interpolate中的示例相同。

我需要像这样的东西:

代码语言:javascript
复制
[[ {{greeting}}, {{name}} || Hello, {{name}} || Hello, stranger ]]

这应该解释为多条件模板,如果同时定义了$scope.greeting和$scope.name,则显示第一个片段,如果只定义了$scope.name,则显示第二个片段,否则显示第三个片段。

其思想是,在symbols []中,||符号之间的片段使用AllOrNothing的标准插值符号进行插值,从左到右进行,直到第一个成功,并确保最后一个总是成功。

我知道这可以用下面这样的东西来完成

代码语言:javascript
复制
<span ng-if='greeting && name">{{greeting}}{{name}}</span>
<span ng-if='name && !greeting">Hello, {{name}}</span>
<span ng-if='!name">Hello, stranger</span>

但是这个解决方案非常麻烦,需要确定哪组复杂的布尔表达式确保只显示一个跨度,并向DOM添加虚假跨度,因为您需要为ng-if指令留出一个位置。

谢谢你的所有建议。

EN

回答 2

Stack Overflow用户

发布于 2014-05-16 09:49:45

您可以编写自己的过滤器来专门处理这种情况。如果你想要一些更可重用的东西,关于条件输出,你可以做一个三元过滤器。Here's one调用了iif (这样命名是为了防止如果我们只称它为if会出现eval错误):

代码语言:javascript
复制
.filter('iif', function() {
  // usage: {{ conditionToTest | iif:truevalue:falseValue }}
  // example: {{ iAmTrue | iif:'I am true':'I am false' }}
  return function(input, trueValue, falseValue) {
      return input ? trueValue : falseValue;
  };
})

在您的示例中如下所示:

代码语言:javascript
复制
{{greeting | iif:greeting:'Hello'}}, {{name | iif:name:'stranger'}}

如果太过冗长,您当然可以进一步专门化:

代码语言:javascript
复制
.filter('valueOrDefault', function() {
    return function(input, defaultValue) {
        return input || defaultValue;
    };
})

然后,您的模板如下所示:

代码语言:javascript
复制
{{ greeting | valueOrDefault:'Hello' }}, {{name | valueOrDefault: 'stranger'}}

诸若此类。

票数 1
EN

Stack Overflow用户

发布于 2014-10-07 01:33:01

内插器应该能够处理它。

代码语言:javascript
复制
<p>{{ greeting || 'Hello' }}, {{ name || 'Stranger' }}.</p>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23691119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档