이중 중괄호와 AngularJS-Twig 충돌


198

아시다시피, 각도와 나뭇 가지에는 공통 제어 구조가 있습니다-이중 중괄호. Angular의 기본값을 어떻게 변경합니까?

나는 나뭇 가지에서 할 수 있다는 것을 알고 있지만 일부 프로젝트에서는 JS 만 할 수 없습니다.



10
콧수염 광증에 대한 또 다른 나뭇 가지 특정 솔루션은 verbatim태그 를 사용하는 것입니다 . 예 : {% verbatim %}{{ angular_var }}{% endverbatim %}AngularJS에 대한 콧수염을 보존하려면 다음과 같이하십시오. twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright

의문의 저자가 아니라 미래의 독자 :이 질문에 대한 답을 찾고 있다면, 서버 측에서 템플릿 렌더링을 피할 수 있다면 (주요 콘텐츠가 인증 영역 내에 있거나 주 검색 엔진 인 경우) 트래픽 소스는 Google이므로 (JS SPA를 구문 분석 할 수 있음).
OZ_

1
@OZ_ prerender.io 와 같은 서비스를 사용할 때 AngularJS 등에 대한 검색 엔진 인수는 상당히 중복됩니다 .
E. Sundin

답변:


287

interpolateProviderservice를 사용하여 시작 및 끝 보간 태그를 변경할 수 있습니다 . 이를위한 편리한 장소 중 하나는 모듈 초기화 시간입니다.

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

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


5
그래도 [[]]를 사용하지는 않습니다. 다음과 같은 일부 바인딩에서는 나쁠 수 있습니다.[[myObject[myArray[index]]
Andrew Joslin

1
진실. {[{}]}입력하기가 조금 이상하지만 장고와 함께 사용 합니다. 답변을 업데이트했습니다.
abhaga

4
감사! Jeykll / Liquid 및 Angular JS와 비슷한 문제가 발생했습니다. {[and]}을 (를) 선택했습니다.
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}}

... Twig와 함께 MtHaml 을 사용하는 사람들을위한 후속 조치 . MtHaml을 사용하면 {{}} 대신-및 =를 통해 Twig 코드에 액세스하므로 일반적인 방식으로 AngularJS curly를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

일반 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 스타일 나뭇 가지가있는 MtHaml + AngularJS :

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

6
가장 유쾌한 방법은 아니지만 호환성 문제에 대해 걱정하지 않는 유일한 방법이라고 생각합니다. Ether 수정 Angular 또는 Twig {{는 호환성 문제 또는 이식성이 떨어질 수 있습니다.
Léo Benoist

1
제공된 솔루션 은 내가 원하는대로 {{'{{contact.name}\}'}} 인쇄 할 때만 작동하기 시작 {{contact.name}}했습니다.
Timo Huovinen

37

Django 및 AngularJS에 대한 비슷한 질문에서 언급했듯이 기본 기호를 변경하는 트릭 (Twig 또는 AngularJS에서)은 타사 소프트웨어와 호환되지 않아 이러한 기호를 사용합니다. 내가 구글에서 찾은 가장 좋은 조언 : https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle은 공유 번들에서 제공하는 템플릿 (TwigBundle 자체에서 제공하는 예외 템플릿 포함)을 사용하는 것을 금지하므로 렉서 구분 기호에 대한 구성을 제공하지 않습니다.

그러나 모든 중괄호를 이탈하는 고통을 피하기 위해 각도 템플릿 주위에 raw 태그를 사용할 수 있습니다. http://twig.sensiolabs.org/doc/tags/raw.html-Christophe | 스토 프

태그가 그대로 이름이 변경되었습니다.


6
원시 태그는 나뭇 가지의 원시 필터와 혼동을 피하기 위해 "verbatim"으로 이름이 변경되었습니다.
stedekay

3
이것이 제 생각에는 가장 깨끗한 방법입니다.
kemicofa 유령

27

당신은 속성 기반의 지시도 사용할 수 <p ng-bind="yourText"></p>와 동일합니다<p>{{yourText}}</p>


4
실제로 더 나은 솔루션이어야합니다.
Alain Jacomet Forte

5
attr에서 어떻게 사용 <li id={{item.id}}></li>합니까?
gkiwi

<p data-ng-bind="yourText"></p>HTML을 유효하게 만드는 것이 더 좋습니다
Jean-Marc Zimmer

24

\{{product.name}}Handlebars에서 식을 무시하고 대신 Angular에서 사용하는 식을 얻는 데 사용할 수 있습니다 .


이것은 정말 유용했습니다
aidan

좋은 해결책-단순히 예약 된 문자를 피하고 핸들 바에서도 작동합니다.
대런

22

이것은 최고의 답변의 컴파일 된 버전이며 동사 블록의 예입니다.

단일 삽입의 경우 다음을 사용하십시오.

{{ '{{model}}' }}

또는 작은 가지 변수를 사용하는 경우

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

Verbatim 은 여러 각도 변수에 대해 매우 우아하고 읽을 수 있습니다.

<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}} : $ select.search} 내에서 {{param}}을 (를) 사용할 수 없으며 솔루션에서 수정했습니다. 감사합니다
balron

19

기존 각도 구문의 템플릿 태그를 변경하지 않으려는 경우 기존 각도 템플릿을 혼란스럽게 다시 작성해야합니다.

다음과 같이 앵귤러 태그와 함께 나뭇 가지 템플릿 태그를 사용할 수 있습니다.

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

다른 비슷한 스레드 답변 에서 이것을 발견했습니다 : symfony2 응용 프로그램의 Angularjs


1
@ThomasReggi OP에서 Twig에 대한 솔루션을 요청하고 있습니다. Liquid에도 사용할 수있는 다른 답변을 확인하십시오.
Noel Llevares

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"을 추가하려고 시도했지만 작동하지 않습니다.
Perkin5

자바 스크립트에 배치해야하며 동일한 장소 컨트롤러가 정의되어 있습니다. 실제 예제 는 script.js 탭 의 문서 ( docs.angularjs.org/api/ng.$interpolateProvider )를 참조하십시오.
Olivier.Roger

2
조심스럽게, Angular에 이중 대괄호를 사용하고 있었지만 Django Message 프레임 워크에 문제가 발생했습니다. 메시지는 [[]]를 포함하는 쿠키를 생성하고 Angular는 쿠키를 구문 분석하고 프로세스에서 질식시킵니다. 메시지의 세션 저장소로 전환하려고 시도했지만 동일한 문제가 발생했습니다. 트리플 꺾쇠 괄호로 바꿨습니다.
더스틴

2

나는 @pabloRN을 좋아하지만 p 대신 결과에 줄을 추가하기 때문에 p 대신 span을 사용하는 것이 좋습니다.

나는 이것을 사용할 것이다 :

<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")}}


답변의 코드 스 니펫에 대한 사용자 코드 블록을 입력하십시오.
β.εηοιτ.βε
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.