AngularJS-Twig ขัดแย้งกับเครื่องหมายปีกกาคู่


198

อย่างที่คุณทราบทั้งเชิงมุมและกิ่งไม้มีโครงสร้างควบคุมร่วมกัน - วงเล็บปีกกาคู่ ฉันจะเปลี่ยนค่าเริ่มต้นของ Angular ได้อย่างไร

ฉันรู้ว่าฉันสามารถทำได้ใน Twig แต่ในบางโครงการฉันทำไม่ได้มีเพียง JS


2
เป็นไปได้ซ้ำของตัวคั่นที่กำหนดเอง
pkozlowski.opensource

10
อีกวิธีแก้ปัญหาเฉพาะกิ่งสำหรับหนวดบ้าคือการใช้verbatimแท็ก เช่น{% verbatim %}{{ angular_var }}{% endverbatim %}เพื่อรักษาหนวดของคุณสำหรับ AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright

ไม่ใช่สำหรับผู้เขียนคำถาม แต่ผู้อ่านในอนาคต: หากคุณกำลังมองหาคำตอบสำหรับคำถามนี้ให้พิจารณาเพื่อหลีกเลี่ยงการแสดงเทมเพลตบนฝั่งเซิร์ฟเวอร์เลยถ้าคุณสามารถจ่ายได้ (ถ้าเนื้อหาหลักของคุณอยู่ในโซนที่รับรองความถูกต้อง เนื่องจากแหล่งที่มาของการเข้าชมคือ Google (พวกเขาสามารถแยกวิเคราะห์ JS SPA)
OZ_

1
@OZ_ อาร์กิวเมนต์เครื่องมือค้นหากับ AngularJS และชอบที่จะกลายเป็นซ้ำซ้อนมากเมื่อใช้บริการเช่นprerender.io
E. Sundin

คำตอบ:


287

คุณสามารถเปลี่ยนแท็กการแก้ไขเริ่มต้นและสิ้นสุดได้โดยใช้interpolateProviderบริการ หนึ่งในสถานที่ที่สะดวกสำหรับการนี้คือในเวลาเริ่มต้นโมดูล

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

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


5
แม้ว่าฉันจะไม่ใช้ [[]] มันอาจจะไม่ดีในการผูกเช่นนี้:[[myObject[myArray[index]]
Andrew Joslin

1
จริง ฉันใช้{[{}]}กับ Django แม้ว่ามันจะแปลกไปหน่อย ฉันได้อัพเดตคำตอบแล้ว
abhaga

4
ขอบคุณ! พบปัญหาที่คล้ายกันกับ Jeykll / Liquid และ Angular JS ฉันเลือกใช้ {[และ]}
jfroom

7
ไม่จำเป็นต้องลบเครื่องหมายอัฒภาคออกหลังจาก} ในบรรทัดที่ 3 หรือไม่
CashIsClay

มีวิธีการทำเช่นนี้ในระดับโลกในเชิงมุมหรือไม่? เว็บไซต์ของเราจะมีโมดูลจำนวนมากในหน้าต่างๆและเราไม่ต้องการที่จะลืม
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}}

... และติดตามผู้ที่ใช้MtHamlควบคู่ไปกับ Twig MtHaml เปิดใช้งานการใช้ AngularJS curlies ในลักษณะปกติเนื่องจากมีการเข้าถึงรหัส 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 {{สามารถสร้างปัญหาความเข้ากันได้หรือการพกพาไม่ดี
Léo Benoist

1
วิธีการแก้ปัญหาที่ให้ไว้ก็เริ่มทำงานให้ฉันเมื่อฉันทำสิ่งนี้ {{'{{contact.name}\}'}} ซึ่งพิมพ์{{contact.name}}ตามที่ฉันต้องการ
Timo Huovinen

37

ดังที่กล่าวไว้ในคำถามที่คล้ายกันเกี่ยวกับ Django และ AngularJS การหลอกลวงด้วยการเปลี่ยนสัญลักษณ์เริ่มต้น (ใน Twig หรือ AngularJS) สามารถให้ความไม่ลงรอยกันกับซอฟต์แวร์ของบุคคลที่สามซึ่งจะใช้สัญลักษณ์เหล่านี้ คำแนะนำที่ดีที่สุดที่ฉันพบใน google: https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle ไม่ได้จัดเตรียมการกำหนดค่าสำหรับตัวคั่น lexer เนื่องจากการเปลี่ยนแปลงจะห้ามคุณใช้เทมเพลตใด ๆ ที่จัดทำโดยบันเดิลที่แชร์ (รวมถึงเทมเพลตข้อยกเว้นที่ TwigBundle จัดหาให้เอง)

อย่างไรก็ตามคุณสามารถใช้แท็ก raw รอบ ๆ เทมเพลตเชิงมุมของคุณเพื่อหลีกเลี่ยงความเจ็บปวดจากการหลีกเลี่ยงวงเล็บปีกกาทั้งหมด: http://twig.sensiolabs.org/doc/tags/raw.html - Christophe | Stof

แท็กถูกเปลี่ยนชื่อเป็นคำต่อคำ


6
โปรดทราบว่าแท็ก raw ถูกเปลี่ยนชื่อเป็น "verbatim" เนื่องจากหลีกเลี่ยงความสับสนกับตัวกรอง raw ของทวิ
stedekay

3
นี่คือความคิดของฉันวิธีที่สะอาดที่สุด
kemicofa ghost

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 แทน


นี้เป็นประโยชน์จริงๆ
ดาน

ทางออกที่ดี - เพียงแค่หลบหนีตัวละครที่จองไว้ยังใช้งานได้ใน Handlebars
darren

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} และโซลูชันของคุณได้รับการแก้ไข ขอบคุณ
balron

19

หากคุณไม่สนใจที่จะเปลี่ยนแท็กแม่แบบของไวยากรณ์เชิงมุมที่มีอยู่ซึ่งจะต้องมีการเขียนเทมเพลตเชิงมุมที่มีความสับสน

หนึ่งสามารถใช้แท็กเทมเพลตกิ่งกับแท็กเชิงมุมเช่น:

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

พบสิ่งนี้ในคำตอบเธรดอื่นที่คล้ายกัน: Angularjs บนแอปพลิเคชัน symfony2


1
@ThomasReggi OP กำลังขอวิธีแก้ปัญหาสำหรับ Twig ตรวจสอบคำตอบอื่น ๆ ที่สามารถใช้งานได้กับ Liquid
Noel Llevares

18

หรือคุณสามารถเปลี่ยนอักขระที่ใช้โดยทวิก นี้จะถูกควบคุมโดย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 ที่มี แต่ไม่ทำงาน
Perkin5

มันจะต้องอยู่ในจาวาสคริปต์ของคุณที่มีการกำหนดตัวควบคุมสถานที่เดียวกัน สำหรับตัวอย่างการทำงานให้ดูที่เอกสาร ( docs.angularjs.org/api/ng.$interpolateProvider ) ในแท็บ script.js
Olivier.Roger

2
คำเตือนฉันใช้วงเล็บเหลี่ยมสองชั้นสำหรับ Angular แต่ฉันเพิ่งพบปัญหากับกรอบข้อความ Django ข้อความสร้างคุกกี้ที่มี [[]] และแองกูลาร์พยายามแยกวิเคราะห์และฉายาในกระบวนการ ฉันได้ลองเปลี่ยนไปใช้ที่เก็บข้อมูลเซสชัน แต่มีปัญหาเดียวกัน ฉันเปลี่ยนเป็นวงเล็บสามเหลี่ยม
ดัสติน

2

ฉันชอบ @pabloRN แต่ฉันต้องการใช้ span แทน p เพราะสำหรับฉัน p จะเพิ่มบรรทัดลงในผลลัพธ์

ฉันจะใช้สิ่งนี้:

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

ฉันยังใช้ aText กับเคอร์เซอร์ภายในเครื่องหมายคำพูดคู่ดังนั้นฉันไม่จำเป็นต้องเขียนทุกสิ่งซ้ำแล้วซ้ำอีก


จริง NG-ผูก = "" เป็นสิ่งที่สำคัญคุณสามารถใช้แท็กใด ๆ ที่คุณชอบ :)
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.