2013-08-06 28 views
11

Trang chủ của tôi có một số javascript nội tuyến được trộn lẫn với một số cú pháp lưỡi, ví dụ:Cú pháp lưỡi của Laravel 4 trong các tệp javascript của tôi

<script type="text/javascript"> 
     @if(Auth::user()) 
      if(path.indexOf('/user/' + {{Auth::user()->id}}) != -1) { 
        $("#tabs").tabs(); 
      }; 
     @endif 
    </script> 

Nó hoạt động cho đến khi tôi muốn chuyển javascript sang tệp bên ngoài.js. Tôi gặp lỗi bất cứ khi nào cú pháp lưỡi được thêm vào. Có cách nào tôi có thể hợp nhất cú pháp lưỡi trong tệp javascript.js của tôi không? Tôi đã cố gắng đổi tên để file.blade.js không có may mắn ...

+0

những gì đã lỗi? –

+0

Uncaught SyntaxError: Mã thông báo không mong muốn ILLEGAL => @if – TechyTimo

+1

Điều đó thực sự hiệu quả với tôi. Bạn nên làm cho nó một câu trả lời. Tôi nhận ra trang chủ của tôi đã nhận được quá lộn xộn với javascript. Tôi tin rằng điều này không kết quả trong một yêu cầu thêm do đó tốc độ tải trang là như nhau. Tại sao bạn đề nghị chống lại nó? – TechyTimo

Trả lời

10

bạn có thể thử này lưu tập tin javascript của bạn trong app/views thư mục và đổi tên nó để xxx.blade.php, vâng .blade.phpBlade động cơ sẽ phân tích nó chỉ nếu .blade.php của nó và sử dụng @include('your javascript filename') để bao gồm các tập tin javascript phân tích bởi Blade, nó sẽ làm việc.

1

Bạn đang outputing chuỗi từ PHP, vì vậy bạn phải gửi kèm theo chuỗi trong '

<script type="text/javascript"> 
    @if(Auth::user()) 
     if(path.indexOf('/user/' + '{{Auth::user()->id}}') != -1) { 
       $("#tabs").tabs(); 
     }; 
    @endif 
</script> 
+0

Tôi gặp lỗi: Uncaught SyntaxError: Mã thông báo không mong muốn ILLEGAL => @if – TechyTimo

+1

Tên của tệp là gì? Nó phải được đặt tên là 'whatever.blade.php' – Andreyco

+0

Nó là một tệp .blade.php nhưng lỗi biến mất khi tôi kèm theo các câu lệnh @if với trong 'quá. như '@if (Auth :: user())'.Vấn đề là, lưỡi php đã không chạy – TechyTimo

41

Mặc dù giải pháp được chấp nhận sẽ hoạt động, đây chắc chắn là một mẫu giả.

Nếu tôi thấy đây không phải là người đã viết nó, tôi sẽ vô cùng bối rối với những gì đang diễn ra.

Đề xuất của tôi nằm trong tệp PHP của bạn, có một khối nhận tất cả các giá trị bạn cần trong tệp bên ngoài, sau đó gọi các tệp bên ngoài.

Vì vậy, trong file PHP của bạn, bạn sẽ có một cái gì đó như:

<script> 
    var userID = "{{ Auth::user()->id }}"; 
    var isUser = "{{ Auth::user() }}" 
</script> 

{{ HTML::script('path/to/js/file.js') }} 

Và trong file javascript của bạn:

if(isUser) 
{ 
    if(path.indexOf('/user/' + userID) != -1) { 
     $("#tabs").tabs(); 
    }; 
} 
+1

cộng với 1 cho các trách nhiệm tách biệt và cho phép tôi giảm bớt js nếu cần –

+1

@BillGarrison, hãy nhớ rằng có, bạn có thể rút gọn - nhưng bạn không thể làm xáo trộn vì điều đó sẽ thay đổi tên biến ! –

+1

Bạn sẽ sử dụng giải pháp này như thế nào và cũng có thể làm xáo trộn? Nó có thể được thực hiện? Bất kỳ thủ thuật nào có thể cho phép obfuscation trong khi vẫn giữ các biến cụ thể? – Drellgor

3

Tôi đã làm như vậy hơn @BrandonRomano, nhưng tôi tìm thấy một cách tiếp cận tốt hơn . Gửi trực tiếp giá trị từ PHP để JS VAR sử dụng: PHP-Vars-To-Js-Transformer

PHP:

JavaScript::put([ 
    'foo' => 'bar', 
    'user' => User::first(), 
    'age' => 29 
]); 

JS:

console.log(foo); // bar 
console.log(user); // User Obj 
console.log(age); // 29 

Bạn có thể thiết lập một không gian tên như:

console.log(server.foo)