Çift Kıvrımlı Parantez ile Açısal JS-Dal çatışması


198

Bildiğiniz gibi, hem açısal hem de dal ortak kontrol yapısına sahiptir - çift kıvırcık parantez. Açısal'ın varsayılan değerini nasıl değiştirebilirim?

Twig'de yapabileceğimi biliyorum, ama bazı projelerde yapamam, sadece JS.



10
Bıyık deliliği için başka bir dal spesifik çözümü verbatimetiketi kullanmaktır ; ör .: {% verbatim %}{{ angular_var }}{% endverbatim %}AngularJS için bıyıklarınızı korumak için: twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright

Sorunun yazarı değil, gelecekteki okuyucular: Bu sorunun cevabını arıyorsanız, göze alabiliyorsanız (ana içeriğiniz kimliği doğrulanmış bölgede veya ana arama motorundaysanız) trafik kaynağı Google olduğundan (JS SPA'yı ayrıştırabilirler).
OZ_

1
@OZ_ prerender.io gibi hizmetler kullanılırken AngularJS ve benzerlerine karşı arama motoru argümanı oldukça gereksiz hale gelir .
E. Sundin

Yanıtlar:


287

interpolateProviderServisi kullanarak başlangıç ​​ve bitiş enterpolasyon etiketlerini değiştirebilirsiniz . Bunun için uygun bir yer modülün başlangıç ​​zamanıdır.

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

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


5
Yine de [[]] kullanmazdım. Bunun gibi bazı ciltlerde kötü olabilir:[[myObject[myArray[index]]
Andrew Joslin

1
Doğru. {[{}]}Yazmak biraz garip olsa da Django ile kullanıyorum . Cevabı güncelledim.
abhaga

4
Teşekkürler! Jeykll / Liquid ve Angular JS ile benzer bir sorunla karşılaştı. {[Ve]} 'ı seçtim.
jfroom

7
Noktalı virgülün 3. satırdaki} sonrasında kaldırılması gerekmez mi?
CashIsClay

Bunu Angular'da küresel düzeyde yapmanın bir yolu var mı? Web sitemiz birçok farklı sayfada çok sayıda modüle sahip olacak ve bunu yapmayı unutmak istemiyoruz.
theY4Kman

89

Bu soru cevaplanmış gibi görünüyor, ancak bahsedilmeyen daha zarif bir çözüm, kıvırcık parantezleri dal kıvırcık parantezler arasındaki tırnak işaretleri içine almaktır:

{{ '{{myModelName}}' }}

İçindekiler için bir değişken kullanıyorsanız, bunun yerine şunu yapın:

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

Çift tırnak değil, tek tırnak kullanmalısınız . Çift tırnak, Twig tarafından dize enterpolasyonunu etkinleştirir, bu nedenle, özellikle ifadeler kullanıyorsanız, içeriklere daha dikkatli olmanız gerekir.


Tüm bu süslü parantezleri görmekten hala nefret ediyorsanız, işlemi otomatikleştirmek için basit bir makro da oluşturabilirsiniz:

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

Dosya olarak kaydedin ve şablonunuza aktarın. ngAdı kısa ve tatlı olduğu için kullanıyorum .

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

Veya makroyu şablonunuzun en üstüne koyabilir ve _self olarak içe aktarabilirsiniz (buraya bakın) :

{% import _self as ng %}

Sonra aşağıdaki gibi kullanın:

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

Bu çıktılar:

{{myModelName}}

... ve TwHam ile birlikte MtHaml kullananların takibi . MtHaml, herhangi bir Twig koduna {{}} yerine - ve = olsa erişildiği için AngularJS curlies'in normal şekilde kullanılmasını sağlar. Örneğin:

Düz HTML + Açısal JS:

<tr ng-repeat="product in products">
   <td> {{ product.name }} </td>
</tr>

MtHaml + Açısal JS:

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

MtHaml stili Dallı MtHaml + AngularJS:

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

6
Belki de en hoş yol değil, ama bence uyumluluk sorunu hakkında endişelenmemenin tek yolu bu. Eter, Angular veya Twig'i değiştirir {{uyumluluk sorunu veya kötü taşınabilirlik oluşturabilir.
Léo Benoist

1
Bunu yapan yalnızca sağlanan çözüm benim için çalışmalara başladı {{'{{contact.name}\}'}} yazdırır hangi {{contact.name}}istediğim kadar
Timo Huovinen

37

Django ve AngularJS hakkında benzer soruda belirtildiği gibi, varsayılan simgeleri (Twig veya AngularJS'de) değiştirme hilesi, bu sembolleri kullanacak olan üçüncü taraf yazılımlarla uyumsuzluk sağlayabilir. Google'da bulduğum en iyi tavsiye: https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle, lexer sınırlayıcıları için bir yapılandırma sağlamaz; çünkü bunları değiştirmek, paylaşılan paketler tarafından sağlanan herhangi bir şablonu (TwigBundle tarafından sağlanan istisna şablonları dahil) kullanmanızı yasaklar.

Ancak, tüm kıvırcık parantezlerden kaçmanın acısını önlemek için açısal şablonlarınızın etrafındaki ham etiketi kullanabilirsiniz: http://twig.sensiolabs.org/doc/tags/raw.html - Christophe | stof

Etiket kelimesi kelimesine yeniden adlandırıldı


6
Ham etiketin, dalın ham filtresiyle karıştırılmaması için "verbatim" olarak yeniden adlandırıldığını lütfen unutmayın.
stedekay

3
Bence bu en temiz yoldur.
kemicofa hayalet

27

Öznitelik tabanlı yönerge <p ng-bind="yourText"></p>ile aynı olan<p>{{yourText}}</p>


4
Aslında bu daha iyi bir çözüm olmalıdır.
Alain Jacomet Forte

5
attr üzerinde nasıl kullanılır, gibi <li id={{item.id}}></li>?
gkiwi

Daha da iyisi <p data-ng-bind="yourText"></p>HTML'yi geçerli kılmak için kullanılırdı
Jean-Marc Zimmer

24

\{{product.name}}Gidon tarafından göz ardı edilen ve bunun yerine Angular tarafından kullanılan ifadeyi almak için kullanabilirsiniz .


Bu gerçekten yararlı oldu
aidan

İyi bir çözüm - basitçe de gidonun çalışır, ayrılmış karakterlerden kurtulmak
bir darren

22

Bu, en iyi yanıtların derlenmiş bir sürümüdür ve kelimesi kelimesine bloklar için bir örnektir:

Tek eklemeler için şunları kullanın:

{{ '{{model}}' }}

veya bir dal değişkeni kullanıyorsanız

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

Verbatim , birkaç açısal değişken için çok zarif ve okunabilir:

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

Ah, bu benim için hayat kurtarıcıydı. Filtre: {{{param}}: $ select.search} içinde {{param}} kullanamadım ve çözümünüz düzeltildi. Thanks
balron

19

Mevcut açısal sözdiziminin şablon etiketlerini değiştirmek istemiyorsanız, mevcut açısal şablonlarınızın kafa karıştırıcı bir şekilde yeniden yazılmasını gerektirecektir.

Dal şablon etiketlerini aşağıdaki gibi açısal etiketlerle kullanabilirsiniz:

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

Bunu başka bir benzer konu cevabında buldu : Bir symfony2 uygulamasındaki Angularjs


1
@ThomasReggi OP Twig için bir çözüm istiyor. Sıvı için de kullanılabilecek diğer cevaplara göz atın.
Noel Llevares

18

Alternatif olarak Twig tarafından kullanılan karakterleri değiştirebilirsiniz. Bu Twig_Lexer tarafından kontrol edilir .

$twig = new Twig_Environment();

$lexer = new Twig_Lexer($twig, array(
    'tag_comment'   => array('[#', '#]'),
    'tag_block'     => array('[%', '%]'),
    'tag_variable'  => array('[[', ']]'),
    'interpolation' => array('#[', ']'),
));
$twig->setLexer($lexer);

Çok yararlı. Teşekkürler.
Anos K.Mhazo

17

Bu gönderiye göre bunu şu şekilde yapabilmelisiniz:

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

2
bu kodları nereye koymalıyım? | ah! Anladım, ng-app = app yapmak zorundayım
zx1986

AngularJS ile başlayıp Laravel 4 içinde çerçeveyi yükledim ve sonra görünüme {{2 + 2}} ekledim - başka bir şey yok ve 4 olarak değerlendirdi. Bunu [[2+] olarak değiştirmek için kodu nereye koyacağım 2]]? Ben aynı sayfada komut dosyası etiketleri arasında ekleme ve içeren div etiketine ng-app = "myApp" ekleyerek denedim ama çalışmıyor.
Perkin5

Javascript'inize yerleştirilmesi gerekir, aynı yer kontrolörleri tanımlanır. Çalışan bir örnek için script.js sekmesindeki belgelere ( docs.angularjs.org/api/ng.$interpolateProvider ) bakın.
Olivier.Roger

2
Dikkatli bir şekilde, Angular için çift köşeli parantez kullanıyordum, ancak Django Message çerçevesiyle ilgili bir sorunla karşılaştım. Mesajlar [[]] içeren bir çerez oluşturur ve Açısal, ayrıştırmaya çalışır ve işlemde boğulur. İletiler için oturum depolama alanına geçmeyi denedim, ancak aynı sorun. Üç köşeli parantezlere geçtim.
Dustin

2

@PabloRN seviyorum, ama p yerine span kullanmayı tercih ederim, çünkü benim için p sonuca satır ekleyecektir.

Bunu kullanacağım:

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

Ayrıca çift tırnak içinde imleç ile aText kullanın, böylece her şeyi tekrar tekrar yazmak zorunda kalmazsınız.


aslında ng-bind = "" önemli olan, istediğiniz herhangi bir etiketi kullanabilirsiniz :)
wesamly

@wesamly Herhangi bir etiketi kullanabilirsiniz, ancak <span>başka içeriğiniz olduğunda satır içi metin için kullanılır. Örneğin:<h1>Welcome <span ng-bind="yourName"></span></h1>
rybo111

1

Açısal direktiflerinizi çevrelemek için dalda bir işlev oluşturabilirsiniz, böylece gitmek yerine ...

{{"angular"}}

git ...

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


Yanıtlarınızdaki kod snippet'i için lütfen kullanıcı kodu engeller.
βε.εηοιτ.βε
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.