【问题标题】:Laravel 4 blade syntax within my javascript files我的javascript文件中的Laravel 4刀片语法
【发布时间】:2013-08-07 03:22:20
【问题描述】:

我的主页有一些内联 javascript,其中包含一些刀片语法,例如

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

在我想将 javascript 移动到外部 file.js 之前,它一直有效。每当添加刀片语法时,我都会出错。有没有办法可以在我的 javascript files.js 中融合刀片语法?我尝试重命名为 file.blade.js 没有运气...

【问题讨论】:

  • Uncaught SyntaxError: Unexpected token ILLEGAL => @if
  • 这对我来说确实很有效。你应该把它作为一个答案。我意识到我的主页被 javascript 弄得太乱了。我相信这不会导致额外的请求,因此页面加载速度是相同的。你为什么反对它?
  • 没有什么具体原因,就是没看懂。
  • 我发现刀片语法很简单。但主要问题是我的页面被javascript超载

标签: javascript laravel laravel-4 blade


【解决方案1】:

您正在从 PHP 输出字符串,因此您必须将该字符串包含在 '

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

【讨论】:

  • 我收到一个错误:Uncaught SyntaxError: Unexpected token ILLEGAL => @if
  • 文件名是什么?它应该命名为whatever.blade.php
  • 这是一个 .blade.php 文件,但是当我将 @if 语句也用 in 括起来时,错误消失了。像'@if(Auth::user())'。问题是,刀片 php 没有运行
【解决方案2】:

您可以尝试将您的 javascript 文件保存在 app/views 文件夹中并将其重命名为 xxx.blade.php ,是的 .blade.php 因为 Blade Engine 只会在其 .blade.php 并使用 @ 时解析它987654325@ 包含 Blade 解析的 javascript 文件,它将起作用。

【讨论】:

    【解决方案3】:

    虽然公认的解决方案会起作用,但这绝对是一种反模式。

    如果我看到这不是写它的人,我会对发生的事情感到非常困惑。

    我的建议是在你的 PHP 文件中,有一个块,它获取你在外部文件中需要的所有值,然后调用外部文件。

    所以在你的 PHP 文件中,你会有类似的东西:

    <script>
        var userID = "{{ Auth::user()->id }}";
        var isUser = "{{ Auth::user() }}"
    </script>
    
    {{ HTML::script('path/to/js/file.js') }}
    

    在你的 javascript 文件中:

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

    【讨论】:

    • 加 1 用于分离职责并允许我在需要时缩小我的 js
    • @BillGarrison,请记住,是的,你可以缩小 - 但你不能混淆,因为这会改变变量名!
    • 您将如何使用此解决方案并且还能进行混淆处理?可以做到吗?在保留特定变量的同时可能允许混淆的任何技巧?
    • 您可以确保变量名称 userIDisUser 不会通过将它们绑定到全局范围(如 window.userIDwindow.isUser)而被混淆......这是什么无论如何,您都需要在单独的 JS 文件中访问这些变量。像 UglifyJS 这样的混淆器应该检测到一个变量正在访问全局范围,并且默认情况下不会混淆它们。但如果有任何不确定性,那么通过window 显式访问就会清楚。
    • 我不喜欢这个解决方案,因为它污染了全局范围,我通常将变量传递给我的 JS 的方法是 &lt;input id="isUser" type="hidden" value="{{ Auth::user() }}" /&gt; 然后使用 $('#isUser').val() 从 JS 中获取它
    【解决方案4】:

    我的做法与@BrandonRomano 相同,但我找到了更好的方法。使用以下命令直接将值从 PHP 发送到 JS vars: 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
    

    您可以设置如下命名空间:

    console.log(server.foo)
    

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2014-08-22
      • 1970-01-01
      • 2012-12-15
      • 2021-06-30
      • 2013-11-12
      • 2018-11-04
      • 2013-02-19
      • 2013-08-03
      相关资源
      最近更新 更多