Konflikt AngularJS-Twig z podwójnymi nawiasami klamrowymi

198

Jak wiadomo, zarówno kątowa, jak i gałązka ma wspólną konstrukcję kontrolną - podwójne nawiasy klamrowe. Jak mogę zmienić domyślną wartość Angular?

Wiem, że mogę to zrobić w Twig, ale w niektórych projektach nie mogę, tylko JS.

Meliborn
źródło
2
możliwy duplikat niestandardowego ogranicznika Angular JS
pkozlowski.opensource
10
Innym specyficznym dla gałązek rozwiązaniem szaleństwa na wąsy jest użycie verbatimznacznika; np .: {% verbatim %}{{ angular_var }}{% endverbatim %}aby zachować wąsy dla AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright
Nie autorowi pytania, ale przyszłym czytelnikom: jeśli szukasz odpowiedzi na to pytanie, rozważ w ogóle uniknięcie renderowania szablonów po stronie serwera, jeśli możesz sobie na to pozwolić (jeśli główna treść znajduje się w strefie uwierzytelnionej lub w głównej wyszukiwarce ponieważ źródłem ruchu jest Google (mogą parsować JS SPA)).
OZ_
1
@OZ_ Argument wyszukiwarki przeciwko AngularJS i tym podobnym staje się dość redundantny podczas korzystania z usług takich jak prerender.io .
E. Sundin

Odpowiedzi:

287

Możesz zmienić znaczniki interpolacji początkowej i końcowej za pomocą interpolateProviderusługi. Jednym dogodnym miejscem do tego jest czas inicjalizacji modułu.

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

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

abhaga
źródło
5
Nie użyłbym jednak [[]]. Może być źle w niektórych wiązaniach, takich jak ten:[[myObject[myArray[index]]
Andrew Joslin
1
Prawdziwe. Używam {[{}]}z Django, chociaż trochę dziwne jest pisanie. Zaktualizowałem odpowiedź.
abhaga,
4
Dzięki! Wystąpił podobny problem z Jeykll / Liquid i Angular JS. Wybrałem {[i]}.
jfroom
7
Czy średnik nie musi być usunięty po} w wierszu 3?
CashIsClay
Czy można to zrobić na poziomie globalnym w Angular? Nasza strona internetowa będzie zawierała wiele modułów na wielu różnych stronach i nie chcemy tego zapominać.
the4Kman
89

To pytanie wydaje się być odpowiedzią, ale bardziej eleganckim rozwiązaniem, o którym nie wspomniano, jest po prostu zamknięcie nawiasów klamrowych w cudzysłów między gałązkami nawiasów klamrowych, tak:

{{ '{{myModelName}}' }}

Jeśli używasz zmiennej dla zawartości, zrób to zamiast tego:

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

Powinieneś używać pojedynczych cudzysłowów , a nie podwójnych. Podwójne cudzysłowy umożliwiają interpolację ciągów przez Twiga, więc musisz być bardziej ostrożny z zawartością, szczególnie jeśli używasz wyrażeń.


Jeśli nadal nie lubisz oglądać tych nawiasów klamrowych, możesz również utworzyć proste makro w celu zautomatyzowania procesu:

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

Zapisz go jako plik i zaimportuj do swojego szablonu. Używam ngnazwy, ponieważ jest krótka i słodka.

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

Możesz też umieścić makro na górze szablonu i zaimportować je jako _self (patrz tutaj) :

{% import _self as ng %}

Następnie użyj go w następujący sposób:

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

To daje:

{{myModelName}}

... i kontynuacja dla tych, którzy używają MtHaml obok Twig. MtHaml umożliwia korzystanie z loków AngularJS w normalny sposób, ponieważ każdy kod Twig jest dostępny - i = zamiast {{}}. Na przykład:

Zwykły 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 z gałązką w stylu MtHaml:

- set twigVariable = "somevalue"
= twigVariable
%tr(ng-repeat="product in products")
   %td {{ product.name }}
robert.corlett
źródło
6
Może nie jest to najprzyjemniejszy sposób, ale moim zdaniem jest to jedyny sposób, aby nie martwić się o problem ze zgodnością. Ether modyfikacja Angular lub Twig {{może spowodować problem ze zgodnością lub złą przenośnością.
Léo Benoist

1
Dostarczone rozwiązanie zaczęło działać dla mnie dopiero wtedy, gdy zrobiłem to, {{'{{contact.name}\}'}} co drukuje {{contact.name}}tak, jak chciałem
Timo Huovinen

37

Jak wspomniano w podobnym pytaniu o Django i AngularJS, sztuczka polegająca na zmianie domyślnych symboli (w Twig lub AngularJS) może zapewnić niezgodność z oprogramowaniem innych firm, które będą używać tych symboli. Więc najlepsza rada, którą znalazłem w Google: https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle nie zapewnia konfiguracji ograniczników leksykalnych, ponieważ ich zmiana zabraniałaby używania szablonów udostępnianych przez wspólne pakiety (w tym szablonów wyjątków udostępnianych przez samą TwigBundle).

Możesz jednak użyć surowego znacznika wokół kątowych szablonów, aby uniknąć bólu ucieczki od wszystkich nawiasów klamrowych: http://twig.sensiolabs.org/doc/tags/raw.html - Christophe | Stof

Tag został przemianowany na dosłownie


6
Pamiętaj, że zmieniono nazwę surowego tagu na „dosłownie”, aby uniknąć pomyłki z surowym filtrem gałązki.
stedekay,

3
To moim zdaniem najczystszy sposób.
kemicofa ghost,

27

Możesz także użyć dyrektywy opartej na atrybutach <p ng-bind="yourText"></p>jest taka sama jak<p>{{yourText}}</p>


4
To musi być lepsze rozwiązanie.
Alain Jacomet Forte,

5
jak używać go na ATTR, jak <li id={{item.id}}></li>?
gkiwi

Jeszcze lepiej byłoby użyć, <p data-ng-bind="yourText"></p>aby HTML był poprawny
Jean-Marc Zimmer

24

Możesz użyć tego, \{{product.name}}aby wyrażenie zostało zignorowane przez Kierownicę i zamiast tego użyte przez Angular.


To było naprawdę przydatne
aidan

Dobre rozwiązanie - po prostu uciec od zarezerwowanych postaci, działa również w Kierownicach
a darren

22

To jest skompilowana wersja najlepszych odpowiedzi i przykład bloków dosłownie:

W przypadku pojedynczych wstawek użyj:

{{ '{{model}}' }}

lub jeśli używasz zmiennej gałązkowej

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

Verbatim , jest bardzo elegancki i czytelny dla kilku zmiennych kątowych:

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

Ach, to było dla mnie ratowanie życia. Nie mogłem użyć {{param}} w filtrze: {{{{param}}: $ select.search} i twoje rozwiązanie to naprawiło. Dzięki
balron
19

Jeśli nie jesteś zainteresowany zmianą znaczników szablonu istniejącej składni kątowej, co wymagałoby nieco mylącego przepisywania istniejących szablonów kątowych.

Można po prostu użyć tagów szablonów gałązek z tagami kątowymi:

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

Znalazłem to na innym podobnym wątku odpowiedź : angularjs na zastosowaniu Symfony2

chrisjlee
źródło
1
@ThomasReggi OP prosi o rozwiązanie dla Twiga. Sprawdź inne odpowiedzi, które mogą również działać w przypadku Liquid.
Noel Llevares,
18

Alternatywnie możesz zmienić postacie używane przez Twiga. Jest to kontrolowane przez 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);
Arnold Daniels
źródło
Bardzo pomocne. Dzięki.
Anos K. Mhazo,
17

Zgodnie z tym postem powinieneś być w stanie to zrobić w następujący sposób:

angular.module('app', [])
  .config(['$interpolateProvider', function ($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
  }]);
Olivier.Roger
źródło
2
gdzie powinienem umieścić te kody? | O! Rozumiem, muszę zrobić ng-app = app
zx1986
Zaczynając od AngularJS i w Laravel 4 załadowałem framework, a następnie dodałem {{2 + 2}} do widoku - nic więcej i uzyskałem ocenę 4. Gdzie umieścić kod, aby zmienić to na [[2+ 2]]? Próbowałem dodać go między znacznikami skryptu na tej samej stronie i dodać ng-app = "myApp" do zawierającego znacznik div, ale to nie działa.
Perkin5
Musi być umieszczony w javascript, zdefiniowane są te same kontrolery miejsca. Aby uzyskać działający przykład, zapoznaj się z dokumentacją ( docs.quarejs.org/api/ng.$interpolateProvider ) na karcie script.js .
Olivier.Roger
2
Słowo ostrzeżenia, użyłem podwójnych nawiasów kwadratowych dla Angulara, ale właśnie napotkałem problem z frameworkiem Django Message. Wiadomości tworzą plik cookie, który zawiera [[]], a Angular próbuje go parsować i dusi się w tym procesie. Próbowałem przejść do przechowywania sesji dla wiadomości, ale ten sam problem. Zmieniłem na potrójne nawiasy kwadratowe.
Dustin,
2

Lubię @pabloRN, ale wolałbym używać span zamiast p, ponieważ dla mnie p doda linię do wyniku.

Użyję tego:

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

Używam również aText z kursorem wewnątrz podwójnego cudzysłowu, więc nie muszę ciągle przepisywać całego tekstu.

sifoo
źródło
tak naprawdę to ng-bind = "" ma znaczenie, możesz użyć dowolnego tagu, który ci się podoba :)
wesamly
@wesamly Możesz użyć dowolnego tagu, ale <span>jest on używany w tekście wstawionym, gdy masz inną treść. Na przykład:<h1>Welcome <span ng-bind="yourName"></span></h1>
rybo111,
1

Możesz utworzyć funkcję w gałązce, aby otaczać swoje dyrektywy kątowe, tak jak zamiast iść ...

{{"angular"}}

ty idź ...

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

marcinzajkowski
źródło
Proszę podać bloki kodu użytkownika w celu uzyskania fragmentu kodu w swoich odpowiedziach.
β.εηοιτ.βε