AngularJS-Twig конфликт с двойными фигурными скобками
198
Как известно, как угловая, так и веточка имеют общую конструкцию управления - двойные фигурные скобки. Как я могу изменить значение по умолчанию Angular?
Я знаю, что могу сделать это в Twig, но в некоторых проектах я не могу, только в JS.
Еще одно решение для сумасшедших усов - использовать verbatimметку; Например: {% verbatim %}{{ angular_var }}{% endverbatim %}чтобы сохранить ваши усы для AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Дарра Энрайт
Не автору вопроса, а будущим читателям: если вы ищете ответ на этот вопрос, постарайтесь вообще избегать рендеринга шаблонов на стороне сервера, если вы можете себе это позволить (если ваш основной контент находится внутри зоны с проверкой подлинности или вы являетесь главной поисковой системой). В качестве источника трафика используется Google (они могут анализировать JS SPA)).
OZ_
1
@OZ_ Аргумент поисковой системы против AngularJS и т. П. Становится довольно избыточным при использовании таких сервисов, как prerender.io .
Е. Сундин,
Ответы:
287
Вы можете изменить начальный и конечный теги интерполяции, используя interpolateProviderсервис. Одним из удобных мест для этого является время инициализации модуля.
Я бы не стал использовать [[]]. Это может быть плохо в некоторых привязках, как этот:[[myObject[myArray[index]]
Эндрю Джослин
1
Правда. Я использую {[{}]}с Django, хотя это немного странно набирать. Я обновил ответ.
Абхага
4
Спасибо! Столкнулся с аналогичной проблемой с Jeykll / Liquid и Angular JS. Я выбрал {[и]}.
Jfroom
7
Не нужно ли ставить точку с запятой после} в строке 3?
CashIsClay
Есть ли способ сделать это на глобальном уровне в Angular? На нашем сайте будет много модулей на разных страницах, и мы не хотим забывать об этом.
theY4Kman
89
Этот вопрос кажется ответом, но более элегантное решение, которое не было упомянуто, состоит в том, чтобы просто заключить фигурные скобки в кавычки между фигурными скобками ветки, вот так:
{{'{{myModelName}}'}}
Если вы используете переменную для содержимого, сделайте это вместо:
{{'{{'~ yourvariable ~'}}'}}
Вы должны использовать одинарные кавычки , а не двойные. Двойные кавычки разрешают интерполяцию строк с помощью Twig, поэтому вы должны быть более осторожны с содержимым, особенно если вы используете выражения.
Если вам все еще не нравится видеть все эти фигурные скобки, вы также можете создать простой макрос для автоматизации процесса:
Сохраните его как файл и импортируйте в свой шаблон. Я использую ngназвание, потому что оно короткое и сладкое.
{%import"forms.html"as ng %}
Или вы можете поместить макрос в верхнюю часть вашего шаблона и импортировать его как _self (см. Здесь) :
{%import _self as ng %}
Затем используйте его следующим образом:
{{ ng.curly('myModelName')}}
Это выводит:
{{myModelName}}
... и продолжение для тех, кто использует MtHaml вместе с Twig. MtHaml позволяет использовать AngularJS curlies обычным способом, потому что любой код Twig доступен, хотя - и = вместо {{}}. Например:
Простой HTML + AngularJS:
<trng-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 }}
Возможно, это не самый приятный способ, но я считаю, что это единственный способ не беспокоиться о проблеме совместимости. 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
Ах, это было спасение для меня. Я не могу использовать {{param}} внутри Filter: {{{param}}: $ select.search}, и ваше решение исправило это. Спасибо
Balron
19
Если вы не заинтересованы в изменении тегов шаблонов существующего углового синтаксиса, что потребует некоторой запутанной перезаписи существующих угловых шаблонов.
Можно просто использовать теги шаблона ветки с угловыми тегами, например, так:
где я должен положить эти коды? | ой! Я понял, мне нужно сделать 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 добавит строку к результату.
Я буду использовать это:
<spanng-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")}}
verbatim
метку; Например:{% verbatim %}{{ angular_var }}{% endverbatim %}
чтобы сохранить ваши усы для AngularJS: twig.sensiolabs.org/doc/tags/verbatim.htmlОтветы:
Вы можете изменить начальный и конечный теги интерполяции, используя
interpolateProvider
сервис. Одним из удобных мест для этого является время инициализации модуля.https://docs.angularjs.org/api/ng/provider/$interpolateProvider
источник
[[myObject[myArray[index]]
{[{}]}
с Django, хотя это немного странно набирать. Я обновил ответ.Этот вопрос кажется ответом, но более элегантное решение, которое не было упомянуто, состоит в том, чтобы просто заключить фигурные скобки в кавычки между фигурными скобками ветки, вот так:
Если вы используете переменную для содержимого, сделайте это вместо:
Вы должны использовать одинарные кавычки , а не двойные. Двойные кавычки разрешают интерполяцию строк с помощью Twig, поэтому вы должны быть более осторожны с содержимым, особенно если вы используете выражения.
Если вам все еще не нравится видеть все эти фигурные скобки, вы также можете создать простой макрос для автоматизации процесса:
Сохраните его как файл и импортируйте в свой шаблон. Я использую
ng
название, потому что оно короткое и сладкое.Или вы можете поместить макрос в верхнюю часть вашего шаблона и импортировать его как _self (см. Здесь) :
Затем используйте его следующим образом:
Это выводит:
... и продолжение для тех, кто использует MtHaml вместе с Twig. MtHaml позволяет использовать AngularJS curlies обычным способом, потому что любой код Twig доступен, хотя - и = вместо {{}}. Например:
Простой HTML + AngularJS:
MtHaml + AngularJS:
MtHaml + AngularJS с веточкой в стиле MtHaml:
источник
{{'{{contact.name}\}'}}
печатая,{{contact.name}}
как я хотелКак уже упоминалось в аналогичном вопросе о Django и AngularJS, уловка с изменением символов по умолчанию (в Twig или AngularJS) может обеспечить несовместимость со сторонним программным обеспечением, которое будет использовать эти символы. Так что лучший совет, который я нашел в Google: https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ
Тег был переименован в дословно
источник
Вы также можете использовать директиву на основе атрибутов так
<p ng-bind="yourText"></p>
же, как<p>{{yourText}}</p>
источник
<li id={{item.id}}></li>
?<p data-ng-bind="yourText"></p>
чтобы сделать HTML вернымВы можете использовать,
\{{product.name}}
чтобы выражение игнорировалось Handlebars и использовалось Angular вместо этого.источник
Это скомпилированная версия лучших ответов и пример для дословных блоков:
Для одиночных вставок используйте:
или если вы используете переменную ветки
Дословно , очень элегантно и читабельно для нескольких угловых переменных:
источник
Если вы не заинтересованы в изменении тегов шаблонов существующего углового синтаксиса, что потребует некоторой запутанной перезаписи существующих угловых шаблонов.
Можно просто использовать теги шаблона ветки с угловыми тегами, например, так:
Нашел этот ответ в другой похожей ветке : Angularjs в приложении symfony2
источник
В качестве альтернативы вы можете изменить символы, используемые Twig. Это контролируется Twig_Lexer .
источник
Согласно этому посту вы должны сделать это следующим образом:
источник
Мне нравится @pabloRN, но я бы предпочел использовать span вместо p, потому что для меня p добавит строку к результату.
Я буду использовать это:
Я также использую текст с курсором внутри двойной кавычки, поэтому мне не нужно переписывать все снова и снова.
источник
<span>
он используется для встроенного текста, когда у вас есть другой контент. Например:<h1>Welcome <span ng-bind="yourName"></span></h1>
Вы можете создать функцию в ветке, чтобы окружать ваши угловые директивы, так что вместо того, чтобы идти ...
{{"angular"}}
ты иди ...
{{angular_parser("angular stuff here output curlies around it")}}
источник