角度表达式{{something || &#34; <something>&#34;}}打破解析器</something>

时间:2014-07-03 18:14:33

标签: angularjs

在我的模板中,如果范围属性不可用,我想打印默认值:

{{myProperty || "default"}}

我正在使用"default"字符串,并意识到尖括号<...>会导致解析器在该表达式上中断。

所以这个

{{myProperty || "<default>"}}

不会发生滑动。

请参阅plunker:http://plnkr.co/edit/emxAdksZs5TGYz9Q84cI?p=preview

我在文档中找不到任何关于此的内容。在我看来,解析器应该按原样传递字符串文字,但我猜不是。有谁知道发生了什么?

4 个答案:

答案 0 :(得分:2)

看起来问题实际上可能与浏览器有关。如果您注意到DOM中的第三个h2标记如下所示:

<h2>Say something: {{something || "<something>"}}</something></h2>

所以看起来浏览器将字符串解释为HTML标记。你需要做John所说的并逃避标签。或者您也可以在控制器上设置默认值,它将通过角度正确解释。

var myapp = angular.module('myapp', []);
myapp.controller('AppController', function($scope){
  $scope.something = undefined || "<something>";

});

JSFiddle Example

答案 1 :(得分:1)

不知道为什么解析器barf就可以了,但我可以告诉你&amp; lt;和&amp; gt;也可以替换&lt;和&gt;符号作为替代。

答案 2 :(得分:0)

正如其他人所提到的,问题是由浏览器和浏览器尝试修复DOM引起的。

此HTML <h2>Say something: {{something || "something"}}</h2>

按如下方式放在DOM树中

h2 node
  text node //=> Say something: {{something || "something"}}

构建DOM后,角度来自并读取标记表达式的文本节点。

使用此HTML:Say something: {{something || "<a>"}} DOM树看起来像:

h2 node
  text node //=> Say something: {{something || "
  <a> node
  text node //=> "}}

文本节点不再在一起,因此没有有效的角度花括号表达式来处理,因此角度不起作用。

答案 3 :(得分:0)

在HTML中,引号对标记之外的解析器没有特殊含义,因此尖括号被读作新标记。尖括号会破坏您的代码,而不是解析器。