197 votes

Conflit AngularJS-Twig avec les accolades doubles

Comme vous le savez, angular et twig ont tous deux une construction de contrôle commune - les doubles accolades. Comment puis-je changer la valeur par défaut d'Angular ?

Je sais que je peux le faire dans Twig, mais dans certains projets je ne peux pas, seulement en JS.

2 votes

10 votes

Une autre solution spécifique à la brindille pour la folie des moustaches est d'utiliser la fonction verbatim étiquette ; par exemple {% verbatim %}{{ angular_var }}{% endverbatim %} pour préserver vos moustaches pour AngularJS : twig.sensiolabs.org/doc/tags/verbatim.html

0 votes

Je ne m'adresse pas à l'auteur de la question, mais aux futurs lecteurs : si vous cherchez une réponse à cette question, envisagez d'éviter complètement le rendu des templates côté serveur, si vous pouvez vous le permettre (si votre contenu principal se trouve dans une zone authentifiée ou si votre principal moteur de recherche comme source de trafic est Google (il peut analyser les SPA JS)).

288voto

abhaga Points 2587

Vous pouvez changer les balises d'interpolation de début et de fin en utilisant interpolateProvider service. Un endroit pratique pour cela est le moment de l'initialisation du module.

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

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

5 votes

Je n'utiliserais pas [[]], cependant. Cela pourrait être mauvais dans certaines liaisons, comme celle-ci : [[myObject[myArray[index]]

1 votes

C'est vrai. J'utilise {[{}]} avec Django bien que ce soit un peu bizarre à taper. J'ai mis à jour la réponse.

4 votes

Merci ! J'ai rencontré un problème similaire avec Jeykll / Liquid et Angular JS. J'ai opté pour {[ et ]}.

91voto

robert.corlett Points 251

Cette question semble avoir trouvé une réponse, mais une solution plus élégante, qui n'a pas été mentionnée, consiste à placer les accolades entre guillemets entre les accolades brins, comme suit :

{{ '{{myModelName}}' }}

Si vous utilisez une variable pour le contenu, faites ceci à la place :

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

Vous devez utiliser guillemets simples et non des guillemets. Les guillemets doubles permettent l'interpolation des chaînes de caractères par Twig. Vous devez donc faire plus attention à leur contenu, surtout si vous utilisez des expressions.


Si vous détestez toujours voir toutes ces accolades, vous pouvez aussi créer une simple macro pour automatiser le processus :

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

Enregistrez-le comme un fichier et importez-le dans votre modèle. J'utilise ng pour le nom parce qu'il est court et doux.

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

Vous pouvez également placer la macro en haut de votre modèle et l'importer en tant que _self. (voir ici) :

{% import _self as ng %}

Utilisez-le ensuite comme suit :

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

Ces sorties :

{{myModelName}}

...et un suivi pour ceux qui utilisent MtHaml à côté de Twig. MtHaml permet d'utiliser les boucles AngularJS de manière normale, car tout code Twig est accessible par - et = au lieu de {{ }}. Par exemple :

HTML simple + 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 avec Twig de style MtHaml :

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

6 votes

Ce n'est peut-être pas le moyen le plus agréable, mais à mon avis c'est le seul moyen de ne pas se soucier des problèmes de compatibilité. Modifier Angular ou Twig {{ pourrait créer un problème de compatibilité ou une mauvaise portabilité.

1 votes

La solution fournie n'a commencé à fonctionner pour moi que lorsque j'ai fait ceci {{'{{contact.name}\}'}} qui imprime {{contact.name}} comme je le voulais

37voto

OZ_ Points 7398

Comme mentionné dans une question similaire sur Django et AngularJS, la modification des symboles par défaut (dans Twig ou AngularJS) peut entraîner une incompatibilité avec les logiciels tiers qui utilisent ces symboles. Le meilleur conseil que j'ai trouvé dans Google : https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle ne fournit pas de configuration pour les délimiteurs de lexer. car les modifier vous interdirait d'utiliser tous les modèles fournis par les bundles partagés (y compris les modèles d'exception fournis par TwigBundle lui-même).

Cependant, vous pouvez utiliser la balise raw autour de vos templates angulaires pour pour éviter d'avoir à échapper à toutes les accolades : http://twig.sensiolabs.org/doc/tags/raw.html -- Christophe | Stof

Le tag a été renommé en in extenso

6 votes

Veuillez noter que la balise raw a été renommée en "verbatim" afin d'éviter toute confusion avec le filtre raw de twig.

3 votes

C'est à mon avis la manière la plus propre.

27voto

pabloRN Points 151

Vous pouvez également utiliser la directive basée sur les attributs <p ng-bind="yourText"></p> est la même chose que <p>{{yourText}}</p>

4 votes

Ce doit être la meilleure solution en fait.

5 votes

Comment l'utiliser sur attr,like <li id={{item.id}}></li> ?

0 votes

Il serait encore mieux d'utiliser <p data-ng-bind="yourText"></p> pour rendre le HTML valide

23voto

Nacho Coloma Points 930

Vous pouvez utiliser \{{product.name}} pour que l'expression soit ignorée par Handlebars et utilisée par Angular à la place.

0 votes

C'était vraiment utile

0 votes

Bonne solution - il suffit d'échapper les caractères réservés, ce qui fonctionne également dans Handlebars.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X