带有双花括号的AngularJS-Twig冲突


198

如您所知,角形和细枝都有共同的控制结构-双花括号。如何更改Angular的默认值?

我知道我可以在Twig中做到这一点,但是在某些项目中,只有JS无法做到。



10
另一个针对胡须疯狂的细枝解决方案是使用verbatim标签。例如:{% verbatim %}{{ angular_var }}{% endverbatim %}为AngularJS保护胡子:twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright

不是问问题的作者,而是将来的读者:如果您正在寻找此问题的答案,请考虑完全避免在服务器端呈现模板(如果您可以承受的话)(如果您的主要内容位于经过身份验证的区域内,或者您是主搜索引擎)流量来源是Google(他们可以解析JS SPA)。
OZ_ 2015年

1
@OZ_使用诸如prerender.io之类的服务时,针对AngularJS等的搜索引擎参数变得非常多余。
E. Sundin

Answers:


287

您可以使用interpolateProviderservice 更改开始和结束插值标签。一个方便的地方是在模块初始化时。

angular.module('myApp', []).config(function($interpolateProvider){
    $interpolateProvider.startSymbol('{[{').endSymbol('}]}');
});

https://docs.angularjs.org/api/ng/provider/$interpolateProvider


5
不过,我不会使用[[]]。在某些绑定中可能是不好的,例如这样的:[[myObject[myArray[index]]
Andrew Joslin 2012年

1
真正。我使用{[{}]}Django,尽管键入起来有点奇怪。我已经更新了答案。
abhaga

4
谢谢!Jeykll / Liquid和Angular JS也遇到了类似的问题。我选择了{[和]}。
jfroom 2013年

7
第3行的}之后不需要删除分号吗?
CashIsClay13年

有没有办法在Angular的全球范围内做到这一点?我们的网站将在许多不同的页面上包含许多模块,我们不想忘记这样做。
theY4Kman 2013年

89

这个问题似乎已经解决,但是尚未提及的更优雅的解决方案是将花括号简单地括在树枝花括号之间的引号中,如下所示:

{{ '{{myModelName}}' }}

如果您使用变量作为内容,请执行以下操作:

{{ '{{' ~ yourvariable ~ '}}' }}

您应该使用单引号而不是双引号。双引号启用了Twig的字符串插值功能,因此您必须更加小心其内容,尤其是在使用表达式时。


如果您仍然讨厌看到所有这些花括号,则还可以创建一个简单的宏来自动执行该过程:

{% macro curly(contents) %}
   {{ '{{' ~ contents ~ '}}' }}
{% endmacro %}

将其另存为文件并将其导入模板。我用ng这个名字是因为它又短又甜。

{% import "forms.html" as ng %}

或者,您可以将宏放在模板的顶部,并将其作为_self导入(请参见此处)

{% import _self as ng %}

然后按如下方式使用它:

{{ ng.curly('myModelName') }}

输出:

{{myModelName}}

...以及对那些与Twig一起使用MtHaml的人的跟进。MtHaml以正常方式启用AngularJS curlies,因为可以通过-和=而不是{{}}访问任何Twig代码。例如:

纯HTML + AngularJS:

<tr ng-repeat="product in products">
   <td> {{ product.name }} </td>
</tr>

MtHaml + AngularJS:

%tr(ng-repeat="product in products")
   %td {{ product.name }}

MtHaml +带有MtHaml样式的Twig的AngularJS:

- set twigVariable = "somevalue"
= twigVariable
%tr(ng-repeat="product in products")
   %td {{ product.name }}

6
这也许不是最愉快的方式,但是我认为这是不用担心兼容性问题的唯一方式。醚修改Angular或Twig {{可能会导致兼容性问题或差的可移植性。
莱奥Benoist

1
所提供的解决方案只有在我完成此工作后才开始为我工作, 并按我的{{'{{contact.name}\}'}}{{contact.name}}
意愿

37

就像在有关Django和AngularJS的类似问题中提到的那样,更改默认符号(在Twig或AngularJS中)的技巧可能会与使用这些符号的第三方软件不兼容。因此,我在Google中找到了最好的建议:https : //groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle没有为词法分析定界符提供配置,因为更改它们会禁止您使用共享捆绑软件提供的任何模板(包括TwigBundle本身提供的异常模板)。

但是,你可以使用你的左右角模板的原始标签,以避免逃避所有的大括号的痛苦: http://twig.sensiolabs.org/doc/tags/raw.html -克里斯托夫| 斯托夫

标记已重命名为逐字


6
请注意,由于避免与树枝的原始过滤器混淆,原始标签已重命名为“ verbatim”。
stedekay 2014年

3
我认为这是最干净的方法。
kemicofa鬼魂

27

您也可以使用基于属性的指令<p ng-bind="yourText"></p><p>{{yourText}}</p>


4
实际上,这肯定是更好的解决方案。
2014年

5
怎样在attr上使用它<li id={{item.id}}></li>
gkiwi

更妙的是使用<p data-ng-bind="yourText"></p>使HTML有效
让-马克·齐默


22

这是最佳答案的汇编版本,也是逐字逐句的示例:

对于单次插入,请使用:

{{ '{{model}}' }}

或者如果您使用细枝变量

{{ '{{' ~ twigVariableWitModelName ~ '}}' }}

Verbatim非常优雅,对几个角度变量可读:

<table ng-table>
    {% verbatim %}
        <tr ng-repeat="user in $data">
        <td data-title="'Name'">{{user.name}}</td>
        <td data-title="'Age'">{{user.age}}</td>
        </tr>
    {% endverbatim %}
</table>

啊,这对我来说是救命稻草。我无法在Filter:{{{param}}:$ select.search}中使用{{param}},您的解决方案将其修复。谢谢
balron '19

19

如果您对更改现有角度语法的模板标签不感兴趣,这将需要对现有角度模板进行一些令人困惑的重写。

可以只将细枝模板标签与角度标签一起使用,如下所示:

{% verbatim %}{{yourName}}{% endverbatim %}

在另一个类似的线程答案上发现了这个问题symfony2应用程序上的Angularjs


1
@ThomasReggi OP正在为Twig寻找解决方案。找出其他同样适用于Liquid的答案。
Noel Llevares 2013年

18

另外,您可以更改Twig使用的字符。这由Twig_Lexer控制。

$twig = new Twig_Environment();

$lexer = new Twig_Lexer($twig, array(
    'tag_comment'   => array('[#', '#]'),
    'tag_block'     => array('[%', '%]'),
    'tag_variable'  => array('[[', ']]'),
    'interpolation' => array('#[', ']'),
));
$twig->setLexer($lexer);

很有帮助。谢谢。
Anos K. Mhazo

17

根据这篇文章,您应该能够做到这一点:

angular.module('app', [])
  .config(['$interpolateProvider', function ($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
  }]);

2
我应该把这些代码放在哪里?| 哦!我知道了,我必须制作ng-app = app
zx1986

刚从AngularJS开始,在Laravel 4中,我加载了框架,然后向视图中添加了{{2 + 2}}-没什么,它的值为4。我在哪里放置代码以将其更改为[[2+ 2]]?我尝试将其添加到同一页面上的脚本标签之间,并将ng-app =“ myApp”添加到包含的div标签中,但是它不起作用。
Perkin13年

它需要放置在您的javascript中,并定义了相同的位置控制器。有关工作示例,请查看script.js选项卡中的文档(docs.angularjs.org/api/ng.$interpolateProvider)。
Olivier.Roger 2013年

2
请注意,我在Angular中使用了双方括号,但我在Django Message框架中遇到了问题。消息会创建一个包含[[]]的cookie,Angular会尝试对其进行解析并在过程中阻塞。我试图切换到会话存储消息,但同样的问题。我改用三方括号。
达斯汀

2

我喜欢@pabloRN,但我更喜欢使用span而不是p,因为对我来说p会在结果中添加行。

我将使用此:

<span ng-bind="yourName"></span>

我也将aText与光标放在双引号内一起使用,因此我不必一遍又一遍地重写整个内容。


实际上ng-bind =“”很重要,您可以使用任何喜欢的标签:)
wesamly 2015年

@wesamly您可以使用任何标签,但是<span>当您有其他内容时,它用于嵌入式文本。例如:<h1>Welcome <span ng-bind="yourName"></span></h1>
rybo111 '16

1

您可以在树枝中创建一个函数来包围您的角度指令,例如,而不是去...

{{"angular"}}

你走 ...

{{angular_parser("angular stuff here output curlies around it")}}


请输入用户代码块以获取答案中的代码段。
β.εηοιτ.βε
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.