AngularJS-Twig конфликт с двойными фигурными скобками


198

Как известно, как угловая, так и веточка имеют общую конструкцию управления - двойные фигурные скобки. Как я могу изменить значение по умолчанию Angular?

Я знаю, что могу сделать это в Twig, но в некоторых проектах я не могу, только в JS.



10
Еще одно решение для сумасшедших усов - использовать verbatimметку; Например: {% verbatim %}{{ angular_var }}{% endverbatim %}чтобы сохранить ваши усы для AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Дарра Энрайт

Не автору вопроса, а будущим читателям: если вы ищете ответ на этот вопрос, постарайтесь вообще избегать рендеринга шаблонов на стороне сервера, если вы можете себе это позволить (если ваш основной контент находится внутри зоны с проверкой подлинности или вы являетесь главной поисковой системой). В качестве источника трафика используется Google (они могут анализировать JS SPA)).
OZ_

1
@OZ_ Аргумент поисковой системы против AngularJS и т. П. Становится довольно избыточным при использовании таких сервисов, как prerender.io .
Е. Сундин,

Ответы:


287

Вы можете изменить начальный и конечный теги интерполяции, используя interpolateProviderсервис. Одним из удобных мест для этого является время инициализации модуля.

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

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


5
Я бы не стал использовать [[]]. Это может быть плохо в некоторых привязках, как этот:[[myObject[myArray[index]]
Эндрю Джослин

1
Правда. Я использую {[{}]}с Django, хотя это немного странно набирать. Я обновил ответ.
Абхага

4
Спасибо! Столкнулся с аналогичной проблемой с Jeykll / Liquid и Angular JS. Я выбрал {[и]}.
Jfroom

7
Не нужно ли ставить точку с запятой после} в строке 3?
CashIsClay

Есть ли способ сделать это на глобальном уровне в Angular? На нашем сайте будет много модулей на разных страницах, и мы не хотим забывать об этом.
theY4Kman

89

Этот вопрос кажется ответом, но более элегантное решение, которое не было упомянуто, состоит в том, чтобы просто заключить фигурные скобки в кавычки между фигурными скобками ветки, вот так:

{{ '{{myModelName}}' }}

Если вы используете переменную для содержимого, сделайте это вместо:

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

Вы должны использовать одинарные кавычки , а не двойные. Двойные кавычки разрешают интерполяцию строк с помощью Twig, поэтому вы должны быть более осторожны с содержимым, особенно если вы используете выражения.


Если вам все еще не нравится видеть все эти фигурные скобки, вы также можете создать простой макрос для автоматизации процесса:

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

Сохраните его как файл и импортируйте в свой шаблон. Я использую ngназвание, потому что оно короткое и сладкое.

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

Или вы можете поместить макрос в верхнюю часть вашего шаблона и импортировать его как _self (см. Здесь) :

{% import _self as ng %}

Затем используйте его следующим образом:

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

Это выводит:

{{myModelName}}

... и продолжение для тех, кто использует MtHaml вместе с Twig. 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:

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

6
Возможно, это не самый приятный способ, но я считаю, что это единственный способ не беспокоиться о проблеме совместимости. Ether modify Angular или Twig {{может привести к проблеме совместимости или плохой переносимости.
Лео Бенуа

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 - Christophe | Stof

Тег был переименован в дословно


6
Обратите внимание, что необработанный тег был переименован в «дословно», чтобы избежать путаницы с необработанным фильтром ветки.
stedekay

3
Это на мой взгляд самый чистый способ.
призрак kemicofa

27

Вы также можете использовать директиву на основе атрибутов так <p ng-bind="yourText"></p>же, как<p>{{yourText}}</p>


4
Это должно быть лучшее решение на самом деле.
Ален Жакомет Форте

5
как использовать его на attr, как <li id={{item.id}}></li>?
gkiwi

Еще лучше было бы использовать, <p data-ng-bind="yourText"></p>чтобы сделать HTML верным
Жан-Марк Циммер

24

Вы можете использовать, \{{product.name}}чтобы выражение игнорировалось Handlebars и использовалось Angular вместо этого.


Это было действительно полезно
aidan

Хорошее решение - просто избежать зарезервированных символов, а также работает в рулях
с Дарреном

22

Это скомпилированная версия лучших ответов и пример для дословных блоков:

Для одиночных вставок используйте:

{{ '{{model}}' }}

или если вы используете переменную ветки

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

Дословно , очень элегантно и читабельно для нескольких угловых переменных:

<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>

Ах, это было спасение для меня. Я не могу использовать {{param}} внутри Filter: {{{param}}: $ select.search}, и ваше решение исправило это. Спасибо
Balron

19

Если вы не заинтересованы в изменении тегов шаблонов существующего углового синтаксиса, что потребует некоторой запутанной перезаписи существующих угловых шаблонов.

Можно просто использовать теги шаблона ветки с угловыми тегами, например, так:

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

Нашел этот ответ в другой похожей ветке : Angularjs в приложении symfony2


1
@ThomasReggi ОП просит решение для Twig. Проверьте другие ответы, которые также могут работать для жидкости.
Ноэль Льеварес

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);

Очень полезно. Спасибо.
Анос К. Мхазо

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, но он не работает.
Perkin5

Это должно быть размещено в вашем javascript, определены контроллеры того же места. Рабочий пример приведен в документации ( docs.angularjs.org/api/ng.$interpolateProvider ) на вкладке script.js.
Оливье. Роджер

2
Предупреждение: я использовал двойные квадратные скобки для Angular, но столкнулся с проблемой в структуре Django Message. Messages создает cookie, который содержит [[]], и Angular пытается его проанализировать и задыхается в процессе. Я попытался переключиться на хранение сессии для сообщений, но та же проблема. Я перешел на тройные квадратные скобки.
Дастин

2

Мне нравится @pabloRN, но я бы предпочел использовать span вместо p, потому что для меня p добавит строку к результату.

Я буду использовать это:

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

Я также использую текст с курсором внутри двойной кавычки, поэтому мне не нужно переписывать все снова и снова.


на самом деле ng-bind = "" это то, что имеет значение, вы можете использовать любой тег, который вам нравится :)
wesamly

@wesamly Вы можете использовать любой тег, но <span>он используется для встроенного текста, когда у вас есть другой контент. Например:<h1>Welcome <span ng-bind="yourName"></span></h1>
rybo111

1

Вы можете создать функцию в ветке, чтобы окружать ваши угловые директивы, так что вместо того, чтобы идти ...

{{"angular"}}

ты иди ...

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


Пожалуйста, код пользователя блокирует фрагмент кода в ваших ответах.
β.εηοιτ.βε
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.