AngularJS-Twig конфлікт з подвійними фігурними дужками


198

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

Я знаю, що можу це зробити в Twig, але в деяких проектах я не можу, тільки JS.



10
Ще одне специфічне для гілочки рішення для вуса божевілля - це використання verbatimмітки; наприклад: {% verbatim %}{{ angular_var }}{% endverbatim %}зберегти вуса для AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Darragh

Не для автора питання, а для майбутніх читачів: якщо ви шукаєте відповіді на це питання, подумайте, щоб уникнути візуалізації шаблонів на стороні сервера, якщо ви можете собі це дозволити (якщо ваш основний вміст знаходиться в зоні автентифікації або ви шукаєте основну пошукову систему як джерело трафіку - 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 ~ '}}' }}

Ви повинні використовувати одинарні лапки , а не подвійні лапки. Подвійні лапки дозволяють Twpo Interpolation 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 у звичайному порядку, оскільки будь-який код 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
Це, можливо, не найприємніший спосіб, але, на мою думку, це єдиний спосіб не турбуватися про питання сумісності. Ефір змінює 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 | Стоф

Тег перейменовано на дослівний


6
Зверніть увагу, що сировинний тег було перейменовано на "дослівно" через те, щоб уникнути плутанини із сирим фільтром гілочки.
stedekay

3
Це на мій погляд найчистіший спосіб.
kemicofa ghost

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, щоб зробити HTML дійсним
Жан-Марк Зіммер

24

Ви можете використовувати, \{{product.name}}щоб вираз проігнорував Handlebars і замість нього використовувався Angular.


Це було дуже корисно
допомога

Гарне рішення - просто втекти від зарезервованих персонажів, також працює в Handlebars
даррен

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}} всередині фільтра: {{{param}}: $ select.search} і ваше рішення виправило це. Спасибі
барон

19

Якщо ви не зацікавлені в зміні тегів шаблонів існуючого кутового синтаксису, що вимагатиме певного переплутування існуючих кутових шаблонів.

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

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

Знайдено це в іншій подібній відповіді теми : Angularjs в додатку symfony2


1
@ThomasReggi ОП просить вирішити Twig. Ознайомтеся з іншими відповідями, які також можуть працювати для Liquid.
Ноель Ллеварес

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

Дуже корисний. Дякую.
Anos K. Mhazo

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, але він не працює.
Перкін5

Його потрібно розмістити у вашому javascript, визначені контролери місця. Для робочого прикладу подивіться документацію ( docs.angularjs.org/api/ng.$interpolateProvider ) на вкладці script.js.
Олів'є.Рогер

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

2

Мені подобається @pabloRN, але я вважаю за краще використовувати span замість p, тому що для мене p додасть рядок до результату.

Я буду використовувати це:

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

Я також використовую aText з курсором всередині подвійної лапки, тому мені не доведеться переписувати все це знову і знову.


насправді 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.