Xung đột AngularJS-Twig với niềng răng xoăn đôi


198

Như bạn đã biết, cả hai góc và cành đều có cấu trúc điều khiển chung - niềng răng xoăn đôi. Làm cách nào để thay đổi giá trị mặc định của Angular?

Tôi biết rằng tôi có thể làm điều đó trong Twig, nhưng trong một số dự án tôi không thể, chỉ có JS.



10
Một giải pháp cụ thể khác cho chứng điên cuồng ria mép là sử dụng verbatimthẻ; ví dụ: {% verbatim %}{{ angular_var }}{% endverbatim %}để bảo vệ ria mép của bạn cho AngularJS: twig.sensiolabs.org/doc/tags/verbatim.html
Darragh Enright

Không phải tác giả của câu hỏi, mà là những người đọc trong tương lai: nếu bạn đang tìm câu trả lời cho câu hỏi này, hãy cân nhắc để tránh các mẫu hiển thị ở phía máy chủ, nếu bạn có đủ khả năng (nếu nội dung chính của bạn nằm trong vùng xác thực hoặc công cụ tìm kiếm chính của bạn vì nguồn lưu lượng truy cập là Google (họ có thể phân tích cú pháp JS SPA)).
OZ_

1
@OZ_ Đối số công cụ tìm kiếm chống lại AngularJS và tương tự trở nên khá dư thừa khi sử dụng các dịch vụ như prerender.io .
E. Sundin

Câu trả lời:


287

Bạn có thể thay đổi thẻ nội suy bắt đầu và kết thúc bằng cách sử dụng interpolateProvider dịch vụ. Một nơi thuận tiện cho việc này là tại thời điểm khởi tạo mô-đun.

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

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


5
Tôi sẽ không sử dụng [[]]. Nó có thể là xấu trong một số ràng buộc, như thế này:[[myObject[myArray[index]]
Andrew Joslin

1
Thật. Tôi sử dụng {[{}]}với Django mặc dù nó hơi lạ khi gõ. Tôi đã cập nhật câu trả lời.
abhaga

4
Cảm ơn! Gặp vấn đề tương tự với Jeykll / Liquid và Angular JS. Tôi đã chọn {[và]}.
jfroom

7
Không phải dấu chấm phẩy cần xóa sau} trên dòng 3?
CashIsClay

Có cách nào để làm điều này ở cấp độ toàn cầu trong Angular không? Trang web của chúng tôi sẽ có nhiều, nhiều mô-đun trên nhiều trang khác nhau và chúng tôi không muốn quên làm điều này.
theY4Kman

89

Câu hỏi này xuất hiện đã được trả lời, nhưng một giải pháp thanh lịch hơn chưa được đề cập là chỉ đơn giản là đính kèm các dấu ngoặc nhọn trong dấu ngoặc kép giữa các dấu ngoặc nhọn, như vậy:

{{ '{{myModelName}}' }}

Nếu bạn đang sử dụng một biến cho nội dung, hãy làm điều này thay vào đó:

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

Bạn nên sử dụng dấu ngoặc đơn , không phải dấu ngoặc kép. Dấu ngoặc kép cho phép nội suy chuỗi bằng Twig, do đó bạn phải cẩn thận hơn với nội dung, đặc biệt nếu bạn đang sử dụng biểu thức.


Nếu bạn vẫn ghét nhìn thấy tất cả các dấu ngoặc nhọn, bạn cũng có thể tạo một macro đơn giản để tự động hóa quy trình:

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

Lưu nó dưới dạng tệp và nhập nó vào mẫu của bạn. Tôi đang sử dụng ngcho tên vì nó ngắn và ngọt ngào.

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

Hoặc bạn có thể đặt macro ở đầu mẫu và nhập dưới dạng _elf (xem tại đây) :

{% import _self as ng %}

Sau đó sử dụng nó như sau:

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

Kết quả này:

{{myModelName}}

... Và theo dõi cho những người sử dụng Mt Haml cùng với Twig. Mt Haml cho phép sử dụng các curlies AngularJS theo cách thông thường bởi vì bất kỳ mã Twig nào cũng được truy cập - và = thay vì {{}}. Ví dụ:

Đồng bằng HTML + AngularJS:

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

Mt Haml + AngularJS:

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

Mt Haml + AngularJS với Twig theo phong cách Mtoutl:

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

6
Nó có thể không phải là cách dễ chịu nhất, nhưng tôi nghĩ đó là cách duy nhất để không lo lắng về vấn đề tương thích. Ether sửa đổi Angular hoặc Twig {{có thể tạo ra sự cố tương thích hoặc tính di động xấu.
Léo Benoist

1
Giải pháp được cung cấp chỉ bắt đầu có hiệu quả với tôi khi tôi thực hiện điều này {{'{{contact.name}\}'}} in {{contact.name}}như tôi muốn
Timo Huovinen

37

Như đã đề cập trong câu hỏi tương tự về Django và AngularJS, mẹo thay đổi các ký hiệu mặc định (trong Twig hoặc AngularJS) có thể cung cấp sự không tương thích với phần mềm của bên thứ ba, sẽ sử dụng các ký hiệu này. Vì vậy, lời khuyên tốt nhất tôi tìm thấy trong google: https://groups.google.com/d/msg/symfony2/kyebufz4M00/8VhF1KWsSAEJ

TwigBundle không cung cấp cấu hình cho các dấu phân cách lexer vì việc thay đổi chúng sẽ cấm bạn sử dụng bất kỳ mẫu nào được cung cấp bởi các gói được chia sẻ (bao gồm các mẫu ngoại lệ do chính TwigBundle cung cấp).

Tuy nhiên, bạn có thể sử dụng thẻ thô xung quanh các mẫu góc cạnh của mình để tránh sự đau đớn khi thoát khỏi tất cả các dấu ngoặc nhọn: http://twig.sensiolabs.org/doc/tags/raw.html - Barshe | Thân hình

Tag đã được đổi tên thành nguyên văn


6
Xin lưu ý rằng thẻ thô đã được đổi tên thành "nguyên văn" do để tránh nhầm lẫn với bộ lọc thô của twig.
stedekay

3
Đây là theo tôi cách sạch nhất.
kemicofa ghost

27

Bạn cũng có thể sử dụng chỉ thị dựa trên thuộc tính <p ng-bind="yourText"></p>giống như<p>{{yourText}}</p>


4
Đây phải là giải pháp tốt hơn thực sự.
Alain Jacomet Forte

5
Làm thế nào để sử dụng nó trên attr, như thế <li id={{item.id}}></li>nào?
gkiwi

Thậm chí tốt hơn sẽ được sử dụng <p data-ng-bind="yourText"></p>để làm cho HTML hợp lệ
Jean-Marc Zimmer

24

Bạn có thể sử dụng \{{product.name}}để có được biểu thức bị bỏ qua bởi Tay cầm và thay vào đó được sử dụng bởi Angular.


Điều này thực sự hữu ích
Aidan

Giải pháp tốt - chỉ cần thoát khỏi các ký tự dành riêng, cũng hoạt động trong Tay cầm
một người yêu dấu

22

Đây là phiên bản được biên dịch của các câu trả lời hay nhất và là ví dụ cho các khối nguyên văn:

Đối với các lần chèn đơn, sử dụng:

{{ '{{model}}' }}

hoặc nếu bạn sử dụng biến twig

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

Nguyên văn , rất thanh lịch và dễ đọc đối với một số biến số góc:

<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, đây là cứu tinh cho tôi. Tôi không thể sử dụng {{param}} bên trong Bộ lọc: {{{param}}: $ select.search} và giải pháp của bạn đã sửa nó. Cảm ơn
balron

19

Nếu bạn không quan tâm đến việc thay đổi các thẻ mẫu của cú pháp góc hiện tại sẽ yêu cầu một số cách viết lại khó hiểu của các mẫu góc hiện tại của bạn.

Người ta chỉ có thể sử dụng các thẻ mẫu twig với các thẻ góc như vậy:

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

Tìm thấy điều này trên một câu trả lời chủ đề tương tự khác : Angularjs trên ứng dụng symfony2


1
@ThomasReggi OP đang yêu cầu một giải pháp cho Twig. Kiểm tra các câu trả lời khác cũng có thể làm việc cho Liquid.
Noel Llevares

18

Ngoài ra, bạn có thể thay đổi các ký tự được sử dụng bởi Twig. Điều này được kiểm soát bởi 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);

Rất hữu ích. Cảm ơn.
Anos K. Mhazo

17

Theo bài đăng này, bạn sẽ có thể làm điều đó như thế này:

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

2
Tôi nên đặt những mã này ở đâu? | Oh! Tôi hiểu rồi, tôi phải làm ng-app = app
zx1986

Chỉ bắt đầu với AngularJS và trong Laravel 4, tôi đã tải khung công tác và sau đó thêm {{2 + 2}} vào chế độ xem - không có gì khác và nó đã đánh giá thành 4. Tôi phải đặt mã ở đâu để thay đổi mã này thành [[2+ 2]]? Tôi đã thử thêm nó vào giữa các thẻ script trên cùng một trang và thêm ng-app = "myApp" vào thẻ div chứa nhưng nó không hoạt động.
Perkin5

Nó cần phải được đặt trong javascript của bạn, cùng một bộ điều khiển địa điểm được xác định. Để biết ví dụ hoạt động, hãy xem tài liệu ( docs.angularjs.org/api/ng.$interpolateProvider ) trong tab script.js.
Olivier.Roger

2
Một lời cảnh báo, tôi đã sử dụng dấu ngoặc vuông cho Angular, nhưng tôi vừa gặp vấn đề với khung Tin nhắn Django. Tin nhắn tạo một cookie có chứa [[]] và Angular cố gắng phân tích cú pháp và cuộn cảm trong quá trình này. Tôi đã thử chuyển sang lưu trữ phiên cho tin nhắn, nhưng cùng một vấn đề. Tôi chuyển sang ba dấu ngoặc vuông.
Dustin

2

Tôi thích @pabloRN, nhưng tôi thích sử dụng span thay vì p, vì đối với tôi p sẽ thêm dòng vào kết quả.

Tôi sẽ sử dụng điều này:

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

Tôi cũng sử dụng aText với con trỏ bên trong trích dẫn kép để tôi không phải viết lại nhiều lần.


thực sự ng-bind = "" mới là vấn đề, bạn có thể sử dụng bất kỳ thẻ nào bạn thích :)
wesamly

@wesamly Bạn có thể sử dụng bất kỳ thẻ nào, nhưng <span>được sử dụng cho văn bản nội tuyến khi bạn có nội dung khác. Ví dụ:<h1>Welcome <span ng-bind="yourName"></span></h1>
rybo111

1

Bạn có thể tạo một hàm trong twig để bao quanh các chỉ thị góc của mình, vì vậy, thay vì đi ...

{{"angular"}}

anh đi ...

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


Vui lòng chặn mã người dùng cho đoạn mã trong câu trả lời của bạn.
β.εηεη
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.