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

198

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

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

Meliborn
источник
2
возможный дубликат пользовательского разделителя Angular JS
pkozlowski.opensource
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

abhaga
источник
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 }}
robert.corlett
источник
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

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

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

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

pabloRN
источник
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

chrisjlee
источник
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(']]');
  }]);
Olivier.Roger
источник
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>

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

sifoo
источник
на самом деле 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")}}

marcinzajkowski
источник
Пожалуйста, код пользователя блокирует фрагмент кода в ваших ответах.
β.εηοιτ.βε