2015-02-13 14 views
6

Như một kịch bản chung mà nhiều nhà phát triển khác gặp phải - chúng ta có một ứng dụng trưởng thành dựa trên Symfony2/TWIG và một số mẫu html.twig quá tải quá nhiều với mã jQuery và khó duy trì. Điều gì về việc ném đi jQuery, và sử dụng Angular? Được cung cấp một số kiến ​​thức cơ bản về mô-đun góc, bộ điều khiển, dịch vụ và phạm vi, và kiến ​​thức sâu về Symfony2/TWIG, vấn đề nắm tay của tôi là - cách tốt nhất để chuyển biến từ các bộ điều khiển/mẫu ghép hiện có của mình sang bộ điều khiển góc ?Cách tốt nhất để chuyển các biến từ Symfony2 sang góc Angular

Tôi không muốn tải phạm vi thông qua cuộc gọi JSON riêng biệt và bộ điều khiển riêng biệt trong Symfony2. Chỉ muốn sử dụng các biến hiện tại tôi có trong cành.

Một cách để làm là khai báo một số js biến toàn cục:

<script> 
var window.someVar = {{ twig_object | json_encode() }}; 
</script> 

một sau đó làm smth như

<div ng-controller="myCtrl" ng-init="init()"> 
<div ng-model="someVar"> .... </div> 
</div> 

và trong điều khiển

app.controller('myCtrl', ['$scope', function($scope) { 
$scope.init = function() { 
    if (window['someVar']) { 
     $scope['someVar'] = window['someVar']; 
    } 
}; 

Nhưng điều này dường như quá xấu xí cho tôi (3 bước) Có thể đơn giản hóa ít nhất hoặc thực hiện theo cách khác không?

+0

My kinh nghiệm của riêng bạn là bạn sẽ trở thành ntly chiến đấu AngularJS. Đối với tôi nó đã được kết thúc dễ dàng hơn để thêm một tham số _format = json vào các tuyến đường của tôi và sau đó chỉ cần trả về json từ bộ điều khiển. Giữ AngularJS hạnh phúc và cành ra khỏi hình ảnh. Plus, bạn sẽ không phải đối phó với toàn bộ vấn đề niềng răng xoăn. – Cerad

+0

@Cerad Tôi rất tò mò về vấn đề về dấu ngoặc nhọn. Trong MVC (mà tôi sử dụng), chúng tôi giới thiệu các biến phía máy chủ với ký hiệu * @ *, nhưng bạn sử dụng cùng một phía máy khách cú pháp ở đây (cho nội suy) như bạn làm phía máy chủ (cho các biến được truyền xuống từ máy chủ)! Bạn không gặp phải vấn đề theo thời gian, hoặc là nó OK vì máy chủ nhìn thấy mã đầu tiên? – JMK

+0

@JMK - Tôi không hiểu câu hỏi của bạn. Tôi tránh các vấn đề xoăn bằng cách giữ các mẫu hình xoắn ốc và angularjs trong các tập tin riêng biệt. Các angularjs được phục vụ trực tiếp mà không đi qua S2 cả. – Cerad

Trả lời

7

Bạn có thể khai báo các biến trực tiếp trong ng-init, vì vậy:

<div ng-controller="myCtrl" ng-init="myModel.someVar='{{ twig_object | json_encode() }}';"> 

Tôi đã qua sử dụng hơn đối với Razor trong ASP.Net MVC nhưng tôi giả định các nguyên tắc tương tự áp dụng ở đây với Symfony2.

Cũng nhớ quy tắc chấm kép, bạn không muốn khai báo giá trị trực tiếp trên phạm vi $.

+0

bạn có thể giải thích phraze lần cuối không? Tại sao tôi không thể viết ng-init = "someVar = '{{twig_object | json_encode()}}';" và nó sẽ khởi tạo $ scope.someVar với twig_object? Có nghĩa là nguyên tắc hai chấm. –

+0

Nguyên tắc là không sao, nhưng mã sẽ không hoạt động, xem câu trả lời của tôi dưới đây cho mã chính xác để làm việc này –

4

Tùy chọn của bạn bị giới hạn trong trường hợp này. Nếu bạn không muốn thực hiện cuộc gọi thêm thì bạn sẽ phải tiêm dữ liệu vào trang dưới dạng biến toàn cục (@JMK cung cấp một cách hữu ích hơn với ngInit). Nó có thể là biến đơn giản, nhưng tôi thấy thuận tiện hơn khi viết nó dưới dạng một số đối tượng và thiết lập một dịch vụ liên tục từ giá trị toàn cầu này. Sau đó, hằng số này có thể được sử dụng trong suốt ứng dụng.

<script> 
window.config = {{ twig_object | json_encode() }}; 
</script> 

Sau đó tạo một hằng số (hoặc value):

app.constant('config', {data: window.config}); 

và trong điều khiển

app.controller('myCtrl', ['$scope', 'config', function($scope, config) { 
    $scope.init = function() { 
     $scope.someVar = config.someVar; 
    }; 
}]); 
+0

là nó có thể khởi tạo $ scope.someVar mà không gọi ng-init, như có thể trong constructor của bộ điều khiển? –

+0

Có, có thể, nhưng bạn vẫn cần bằng cách nào đó để ghi dữ liệu này vào bộ điều khiển của bạn. Nếu ứng dụng của bạn nằm bên trong tệp js riêng biệt thì bạn lại cần phải viết nó vào HTML dưới dạng biến toàn cầu hoặc dưới dạng ng-init trên một phần tử nào đó. – dfsq

+0

rõ ràng, cảm ơn. Đã học về hằng số :) –

2

Thật sự tôi nghĩ rằng đây là giải pháp làm việc đơn giản nhất:

<div ng-init='somevar = {{ somevar|raw|replace({"'":"\\'"}) }}'> 
+0

Mã này giới thiệu lỗ hổng XSS thông qua biến somevar. –

Các vấn đề liên quan