【问题标题】:Angular2 template issue with double not (!!+)Angular2模板问题与双不(!!+)
【发布时间】:2016-03-30 08:39:15
【问题描述】:

几个小时以来我一直在用这个砸我的头,但我现在很确定这是某个地方的 Angular2 问题。

场景:我从我的 PHP "isLiked": "1" 获得了 JSON 格式的 tinyint。由于 JSON,tinyint 被 Javascript 理解为字符串而不是布尔值,所以我一直使用好的 ol'!!+isLiked 将其更改为布尔值。

在我需要做的 Angular2 模板中:

<i class="glyphicon {{ (!(!!+post.isLiked) ) ? 'glyphicon-heart-empty' : 'glyphicon-heart' }}"></i>

这段代码曾经在 Backbone 中使用 Underscore 模板完美运行。但是,Angular2 似乎做了一些改变 !!+"0" 评估方式的事情!

在 Chrome 控制台中: !!+"0" 返回false

在骨干+下划线中: 模板中的<% !!+"0" %> 显示false

在 Angular2 中: 模板中的{{ !!+"0" }} 显示true

这是它的游乐场http://plnkr.co/E3YGYeQ5ZZIRh8JxsUN6

false 来自 index.html 中一个简单的 Javascript document.write(!!+"0"),在 Angular 执行任何操作之前。

truesrc/app.ts 模板内。

我错过了什么吗?

【问题讨论】:

  • 我对 Angular 没用,但是如果你写 post.isLiked == true 而不是 !!+post.isLiked 会发生什么?
  • 不会因为 post.isLiked 实际上是“0”或“1”(字符串)而不是真假。
  • 试试看?在 JavaScript 中工作
  • 我知道可以,但我不能使用它。我的老板有一个严格(而且很奇怪)的政策,即“布尔值应该匹配=== true=== false 的支票。他出于某种原因不喜欢== true,而且热情洋溢。也许这在他生命的早期引起了问题,谁知道呢? 重点是,我必须操纵我的值以获得实际的布尔值,而不是布尔值。

标签: javascript templates angular


【解决方案1】:

Angular 模板语法不支持完整的 JavaScript 语法。 只需将您的代码移至函数并调用它即可

<i class="glyphicon  {{ truthyCheck(+post.isLiked) ? 'glyphicon-heart-empty' : 'glyphicon-heart'  }}">
class MyComponent {
  trutyCheck(value):boolean {
    return !(!!+post.isLiked) ;
  }
}

Plunker example

另见
- https://angular.io/docs/ts/latest/guide/template-syntax.html#!#template-expressions
- https://angular.io/docs/ts/latest/guide/template-syntax.html#!#template-statements

【讨论】:

  • 那么就没有办法执行任意的javascript了吗?如果我想 console.log 我的帖子什么的怎么办?在每个需要检查我的 PHP 提供的布尔值的组件中创建一个函数似乎很麻烦。
  • 不能在模板中调用consolewindow、...等全局函数。在执行此操作的组件/指令中创建一个函数并调用此函数。
  • 我想我现在看看如何制作一个全局指令,这样我就不必到处复制调试代码 (console.log) 和布尔检查代码了..
  • @Growiel,“我们用一种类似于 JavaScript 的语言编写模板表达式。许多 JavaScript 表达式是合法的模板表达式,但不是全部。”阅读有关限制的更多信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多