【问题标题】:AngularJS-Twig conflict with double curly bracesAngularJS-Twig 与双花括号冲突
【发布时间】:2012-11-20 05:41:23
【问题描述】:

如您所知,angular 和 twig 都有共同的控制结构——双花括号。如何更改 Angular 的默认值?

我知道我在 Twig 中可以做到,但在某些项目中我不能,只有 JS。

【问题讨论】:

  • Angular JS custom delimiter 的可能重复项
  • 另一个针对小胡子疯狂的特定树枝解决方案是使用verbatim 标签;例如:{% verbatim %}{{ angular_var }}{% endverbatim %} 为 AngularJS 保留胡须:twig.sensiolabs.org/doc/tags/verbatim.html
  • 不是问题的作者,而是未来的读者:如果您正在寻找这个问题的答案,请考虑完全避免在服务器端呈现模板,如果您负担得起的话(如果您的主要内容是在经过身份验证的区域内或您作为流量来源的主要搜索引擎是 Google(他们可以解析 JS SPA))。
  • @OZ_ 在使用prerender.io 之类的服务时,针对 AngularJS 等的搜索引擎参数变得非常多余。

标签: angularjs twig


【解决方案1】:

根据this post,您应该可以这样做:

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

【讨论】:

  • 我应该把这些代码放在哪里? |哦!我明白了,我必须让 ng-app=app
  • 刚从 AngularJS 开始,在 Laravel 4 中我加载了框架,然后将 {{2+2}} 添加到视图中 - 没有其他任何东西,它评估为 4。我在哪里放置代码将其更改为 [[2+2]]?我尝试在同一页面上的脚本标签之间添加它,并将 ng-app="myApp" 添加到包含的 div 标签,但它不起作用。
  • 它需要放在你的javascript中,定义相同的地方控制器。有关工作示例,请查看 script.js 选项卡中的文档 (docs.angularjs.org/api/ng.$interpolateProvider)。
  • 请注意,我在 Angular 中使用了方括号,但我刚刚遇到了 Django Message 框架的问题。 Messages 创建了一个包含 [[ ]] 的 cookie,Angular 尝试解析它并在这个过程中阻塞。我已经尝试切换到消息的会话存储,但同样的问题。我切换到三方括号。
【解决方案2】:

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

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

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

【讨论】:

  • 不过,我不会使用 [[]]。在某些绑定中可能会很糟糕,例如:[[myObject[myArray[index]]
  • 是的。我在 Django 中使用{[{}]},尽管输入起来有点奇怪。我已经更新了答案。
  • 谢谢! Jeykll / Liquid 和 Angular JS 遇到了类似的问题。我选择了 {[ 和 ]}。
  • 第 3 行 } 后面的分号不需要去掉吗?
  • 有没有办法在 Angular 的全局级别上做到这一点?我们的网站将在许多不同的页面上包含许多模块,我们不想忘记这样做。
【解决方案3】:

正如在关于 Django 和 AngularJS 的类似问题中提到的,更改默认符号的技巧(在 Twig 或 AngularJS 中)可能会导致与将使用这些符号的第三方软件不兼容。 所以我在谷歌找到了最好的建议:https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle 不提供词法分析器分隔符的配置 因为更改它们会禁止您使用由 共享包(包括由 TwigBundle 本身)。

但是,您可以在 Angular 模板周围使用原始标签 避免逃避所有花括号的痛苦: http://twig.sensiolabs.org/doc/tags/raw.html -- 克里斯托夫 |斯托夫

标签重命名为verbatim

【讨论】:

  • 请注意,为了避免与 twig 的原始过滤器混淆,原始标签已重命名为“逐字”。
  • 我认为这是最干净的方式。
【解决方案4】:

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

【讨论】:

  • 这实际上一定是更好的解决方案。
  • 怎么在 attr 上使用,比如<li id={{item.id}}></li> ?
  • 使用<p data-ng-bind="yourText"></p> 使 HTML 有效
【解决方案5】:

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

可以只使用带有角标签的树枝模板标签,如下所示:

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

在另一个类似的帖子上找到这个answer:Angularjs on a symfony2 application

【讨论】:

  • @ThomasReggi OP 正在为 Twig 寻求解决方案。查看其他也适用于 Liquid 的答案。
【解决方案6】:

这个问题似乎得到了回答,但一个更优雅的解决方案没有被提及是简单地将花括号括在树枝花括号之间的引号中,如下所示:

{{ '{{myModelName}}' }}

如果您对内容使用变量,请改为:

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

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


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

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

将其保存为文件并将其导入您的模板。我使用ng 作为名称,因为它又短又甜。

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

或者您可以将宏放在模板顶部并将其导入为_self (see here)

{% 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 + AngularJS 和 MtHaml 风格的 Twig:

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

【讨论】:

  • 这可能不是最愉快的方式,但我认为这是不担心兼容性问题的唯一方法。以太修改 Angular 或 Twig {{ 可能会造成兼容性问题或可移植性差。
  • 当我这样做 {{'{{contact.name}\}'}} 按我的意愿打印 {{contact.name}} 时,提供的解决方案才开始为我工作
【解决方案7】:

您可以使用\{{product.name}} 来获取被 Handlebars 忽略并由 Angular 使用的表达式。

【讨论】:

  • 这真的很有用
  • 很好的解决方案 - 只需转义保留字符,也适用于 Handlebars
【解决方案8】:

您也可以更改 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);

【讨论】:

  • 非常有帮助。谢谢。
【解决方案9】:

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

我会用这个:

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

我还在双引号内使用带有光标的 aText,这样我就不必一遍又一遍地重写整个内容。

【讨论】:

  • 其实 ng-bind="" 才是最重要的,你可以使用任何你喜欢的标签:)
  • @wesamly 可以使用任何标签,但是当您有其他内容时,&lt;span&gt; 用于内联文本。例如:&lt;h1&gt;Welcome &lt;span ng-bind="yourName"&gt;&lt;/span&gt;&lt;/h1&gt;
【解决方案10】:

这是最佳答案的编译版本和逐字块的示例:

对于单次插入,请使用:

{{ '{{model}}' }}

或者如果你使用 twig 变量

{{ '{{' ~ 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}} 并且您的解决方案已修复它。谢谢
【解决方案11】:

您可以在 twig 中创建一个函数来围绕您的角度指令,所以喜欢而不是去...

{{"angular"}}

你去...

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

【讨论】:

  • 请在您的答案中使用代码块以获取代码 sn-p。
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2015-04-11
  • 2012-06-05
  • 2015-04-14
相关资源
最近更新 更多