AngularJS-Twig与双花括号冲突

Mel*_*orn 197 twig angularjs

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

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

abh*_*aga 285

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

angular.module('myApp', []).config(function($interpolateProvider){
    $interpolateProvider.startSymbol('{[{').endSymbol('}]}');
});
Run Code Online (Sandbox Code Playgroud)

http://docs.angularjs.org/api/ng.$interpolateProvider

  • 在第3行的}之后是否需要删除分号? (7认同)
  • 不过,我不会用[[]].在某些绑定中可能会很糟糕,例如:[[myObject [myArray [index]]` (5认同)
  • 谢谢!与Jeykll/Liquid和Angular JS有类似的问题.我选择{[和]}. (4认同)

rob*_*ett 88

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

{{ '{{myModelName}}' }}
Run Code Online (Sandbox Code Playgroud)

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

{{ '{{' ~ yourvariable ~ '}}' }}
Run Code Online (Sandbox Code Playgroud)

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


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

{% macro curly(contents) %}
   {{ '{{' ~ contents ~ '}}' }}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

将其另存为文件并将其导入模板.我正在使用ng这个名字,因为它短而甜.

{% import "forms.html" as ng %}
Run Code Online (Sandbox Code Playgroud)

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

{% import _self as ng %}
Run Code Online (Sandbox Code Playgroud)

然后使用如下:

{{ ng.curly('myModelName') }}
Run Code Online (Sandbox Code Playgroud)

这输出:

{{myModelName}}
Run Code Online (Sandbox Code Playgroud)

......以及那些在Twig旁边使用MtHaml的人的后续行动.MtHaml允许以正常方式使用AngularJS curlies,因为可以访问任何Twig代码 - 而不是{{}}.例如:

纯HTML + AngularJS:

<tr ng-repeat="product in products">
   <td> {{ product.name }} </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

MtHaml + AngularJS:

%tr(ng-repeat="product in products")
   %td {{ product.name }}
Run Code Online (Sandbox Code Playgroud)

MtHaml + AngularJS与MtHaml风格的树枝:

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

  • 这可能不是最愉快的方式,但我认为这是不担心兼容性问题的唯一方法.Ether修改Angular或Twig {{可能会产生兼容性问题或可移植性差. (6认同)

OZ_*_*OZ_ 36

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

TwigBundle不为词法分隔符提供配置,因为更改它们会禁止您使用共享包提供的任何模板(包括TwigBundle自身提供的异常模板).

但是,您可以在角度模板周围使用原始标记,以避免逃避所有花括号的痛苦:http: //twig.sensiolabs.org/doc/tags/raw.html - Christophe | STOF

标签已重命名为逐字

  • 请注意,原始标签已重命名为"逐字",因为避免与树枝的原始过滤器混淆. (6认同)
  • +1我宁愿保持Angualr花括号不受影响.谢谢 (3认同)
  • 在我看来,这是最干净的方式. (3认同)

pab*_*oRN 27

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

  • 如何在attr上使用它,比如`<li id = {{item.id}}> </ li>`? (5认同)
  • 这实际上必须是更好的解决方案. (4认同)

Nac*_*oma 23

您可以使用\{{product.name}}Handlebars忽略表达式并由Angular使用.


Gui*_*big 21

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

对于单次插入,请使用:

{{ '{{model}}' }}
Run Code Online (Sandbox Code Playgroud)

或者如果你使用树枝变量

{{ '{{' ~ twigVariableWitModelName ~ '}}' }}
Run Code Online (Sandbox Code Playgroud)

逐字,对于几个角度变量非常优雅和可读:

<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>
Run Code Online (Sandbox Code Playgroud)


chr*_*lee 18

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

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

{% verbatim %}{{yourName}}{% endverbatim %}
Run Code Online (Sandbox Code Playgroud)

在另一个类似的线程回答中找到了这个:symfony2应用程序上的Angularjs


Jas*_*els 17

或者,您可以更改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);
Run Code Online (Sandbox Code Playgroud)


Oli*_*ger 16

根据这篇文章你应该能够这样做:

angular.module('app', [])
  .config(['$interpolateProvider', function ($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
  }]);
Run Code Online (Sandbox Code Playgroud)

  • 我应该把这些代码放在哪里?| 哦!我明白了,我必须制作ng-app = app (2认同)
  • 需要注意的是,我正在使用Angular的双方括号,但我刚刚遇到了Django Message框架的问题.消息创建一个包含[[]]的cookie,Angular尝试解析它并在进程中阻塞.我已尝试切换到会话存储的消息,但同样的问题.我切换到三方括号. (2认同)