【问题标题】:Passing a PHP variable to JavaScript in a Blade template在 Blade 模板中将 PHP 变量传递给 JavaScript
【发布时间】:2015-07-16 10:25:54
【问题描述】:

JavaScript 有什么方法可以从 Laravel Blade 模板中的控制器获取变量?

示例: 我有以下代码:

$langs = Language::all();
return View::make('NAATIMockTest.Admin.Language.index',compact('langs'));

我可以获取$langs 并将其传递给 JavaScript 吗?我已经用过PHP-Vars-To-Js-Transformer。但是当我将JavaScript::put() 用于控制器中的两个功能时。它没有用。有什么帮助吗?

这是我在控制器中的创建函数:

public function create()
{
    $names = $this->initLang();
    Javascript::put([
        'langs' => $names
    ]);
    
    return View::make('NAATIMockTest.Admin.Language.create',compact('names'));
}

这是我的看法:

@extends('AdLayout')
@section('content')
<script type="text/javascript">
    var app = angular.module('myApp', []);
    app.controller('langCtrl', function($scope) {
        $scope.languages = langs;
    });
</script>
    
<div class="container-fluid" ng-app="myApp" ng-controller="langCtrl">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h2>Create language</h2>
                </div>
                    
                <div class="panel-body">
                    {!! Form::open() !!}
                        <p class="text-center">
                            {!! Form::label('Name','Language: ') !!}
                            <input type="text" name="searchLanguage" ng-model="searchLanguage">
                        </p>
    
                        <select name="Name[]" multiple size="10" ng-model="lang" ng-click="show()">
                            <option value="@{{v}}" ng-repeat="(k,v) in languages | filter:searchLanguage">
                                @{{v}}
                            </option>
                        </select><br>
    
                        <div class="text-center">
                            {!! Form::submit('Create',['class'=>'btn btn-primary']) !!}&nbsp;
                            {!!   Html::linkAction('NAATIMockTest\LanguageController@index', 'Back', null, array('class' => 'btn btn-primary')) !!}
                        </div>
                    {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

我在配置文件夹中的 javascript.php:

<?php
return [
    'bind_js_vars_to_this_view' => 'footer',
    'bind_js_vars_to_this_view' => 'NAATIMockTest.Admin.Language.create',
    'bind_js_vars_to_this_view' => 'NAATIMockTest.Admin.Language.edit',
    
    'js_namespace' => 'window',
];

这个想法是: 我在 MySQL 中有一种表语言。我想显示具有多个属性的下拉列表可供选择,并且我也想使用 angularjs 进行搜索。这就是为什么我想将变量从控制器传递给 JavaScript。此外,我在 LanguageController 中有一个名为 initLang 的函数来检查数据库中是否存在任何语言,它不会显示在创建视图的下拉列表中。

【问题讨论】:

  • 您能否也说明您希望如何在 javacript 代码中使用语言?
  • 由于您已经在使用一个包,请向我们展示不起作用的代码。 (编辑您的问题)
  • 也许这两个函数确实渲染了视图或部分视图,您选择将 javascript 变量绑定到?
  • 它只适用于编辑视图,但对于创建视图我根本不起作用。我想使用 angularjs 来搜索而不是使用 laravel
  • 对不起,我的网络信号不好

标签: javascript laravel laravel-blade


【解决方案1】:
$langs = Language::all()->toArray();
return View::make('NAATIMockTest.Admin.Language.index', [
    'langs' => $langs
]);

然后在视图中

<script type="text/javascript">
    var langs = {{json_encode($langs)}};
    console.log(langs);
</script>

不好看

【讨论】:

  • 感谢您的代码,但它向我展示了这个问题:LanguageController.php 第 34 行中的 FatalErrorException:在非对象上调用成员函数 toArray()
  • 你能把那行的代码和任何相关的东西贴出来吗?
  • 这个错误是未定义的变量:langs(查看:/home/thienvulai/laravel/sls/resources/views/NAATIMockTest/Admin/Language/create.blade.php)。当我尝试使用 Javascript::put([ 'langs' => $names ]);
  • 我的代码没有使用 Javascript 类。如果您只使用我的代码在控制器中创建一个测试方法,然后在视图中注释除我的代码之外的所有其他内容,您应该会在控制台中看到 langs 对象。然后,您可以在 javascript 中使用 langs 变量
  • 感谢 Pawel Bieszczad、Alpha 和所有试图解决我问题的人。我刚醒来。是的,我确实尝试了您的代码 Pawel Bieszczad,但它让我遇到了问题:“未捕获的 SyntaxError:意外的令牌 &”。而且我正在使用 laravel-5 而不是 laravel-4 所以文件 filters.php 不存在。那我该怎么办。
【解决方案2】:

对我来说是一个工作示例。

控制器:

public function tableView()
{
    $sites = Site::all();
    return view('main.table', compact('sites'));
}

查看:

<script>    
    var sites = {!! json_encode($sites->toArray()) !!};
</script>

为防止恶意/意外行为,您可以按照 Jon 在链接到此 SO answer 的评论中的建议使用 JSON_HEX_TAG

<script>    
    var sites = {!! json_encode($sites->toArray(), JSON_HEX_TAG) !!};
</script>

【讨论】:

  • 您可能需要将 JSON_HEX_TAG 添加到 json_encode {!! json_encode($sites-&gt;toArray(), JSON_HEX_TAG) !!}; stackoverflow.com/questions/24855186/…
  • @ken 哦,这确实有效,但在 html 的开头和结尾都有引号。我怎样才能摆脱它们?
  • nvm,我没有意识到我在使用json_encode时不需要引号
  • 或者只是var sites = @json($sites-&gt;toArray())
  • @Andrew 你可以去掉双引号再试一次。
【解决方案3】:

假设您有一个名为$services 的集合,您将其传递给视图。

如果您需要一个带有名称的 JS 数组,您可以按如下方式对其进行迭代:

<script>
    const myServices = [];
    @foreach ($services as $service)
        myServices.push('{{ $service->name }}');
    @endforeach
</script>

注意:如果字符串有特殊字符(如ó或HTML代码),您可以使用{!! $service-&gt;name !!}

如果您需要一个对象数组(包含所有属性),您可以使用:

<script>
  const myServices = @json($services);
  // ...
</script>

注意:这个刀片指令 @json 不适用于旧 Laravel 版本。您可以使用 json_encode 获得相同的结果,如其他答案中所述。


有时您不需要将完整的集合传递给视图,只需传递一个具有 1 个属性的数组即可。如果是这种情况,最好在 Controller 中使用 $services = Service::pluck('name');

【讨论】:

  • 为什么不使用var sampleTags = [{{ $services-&gt;implode(',') }}]; 或类似的?
  • 我记得,最新版本的 Laravel 也有一个刀片指令,可以像 @json($services) 一样简化它。
【解决方案4】:

标准 PHP 对象

向 JavaScript 提供 PHP 变量的最佳方式是 json_encode。使用 Blade 时,您可以这样做:

<script>
    var bool = {!! json_encode($bool) !!};
    var int = {!! json_encode($int) !!};
    /* ... */
    var array = {!! json_encode($array_without_keys) !!};
    var object = {!! json_encode($array_with_keys) !!};
    var object = {!! json_encode($stdClass) !!};
</script>

还有一个用于解码为 JSON 的 Blade 指令。我不确定从哪个版本的 Laravel 但在 5.5 中可用。像下面这样使用它:

<script>
    var array = @json($array);
</script>

Jsonable 的

当使用 Laravel 对象时,例如CollectionModel 你应该使用 -&gt;toJson() 方法。所有那些实现\Illuminate\Contracts\Support\Jsonable 接口的类都支持这个方法调用。呼叫自动返回JSON

<script>
    var collection = {!! $collection->toJson() !!};
    var model = {!! $model->toJson() !!};
</script>

使用Model 类时,您可以在class 中定义$hidden 属性,这些属性将在JSON 中过滤。正如其名称所描述的,$hidden 属性隐藏了敏感内容。所以这个机制对我来说是最好的。像下面这样:

class User extends Model
{
    /* ... */

    protected $hidden = [
        'password', 'ip_address' /* , ... */
    ];

    /* ... */
}

在你视野中的某个地方

<script>
    var user = {!! $user->toJson() !!};
</script>

【讨论】:

  • var bool = {!! json_encode($bool) !!}; 为我工作。谢谢大佬!
  • 最好的方法是什么?
  • 根据使用庞大的库或直接响应客户端,这是一种常见的解决方案。
【解决方案5】:

试试这个 - https://github.com/laracasts/PHP-Vars-To-Js-Transformer 是将 PHP 变量附加到 Javascript 的简单方法。

【讨论】:

    【解决方案6】:

    很简单,我用这个代码:

    控制器

    $langs = Language::all()->toArray();
    return view('NAATIMockTest.Admin.Language.index', compact('langs'));
    

    查看

    <script type="text/javascript">
        var langs = <?php echo json_decode($langs); ?>;
        console.log(langs);
    </script>
    

    希望对您有所帮助,问候!

    【讨论】:

      【解决方案7】:

      最好的办法是把它放在php刀片中的一个隐藏的div中

      <div hidden id="token">{{$token}}</div>
      

      然后在 javascript 中将其作为常量调用以避免未定义的 var 错误

      const token = document.querySelector('div[id=token]').textContent
      
      // console.log(token)
      // eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI5MjNlOTcyMi02N2NmLTQ4M2UtYTk4Mi01YmE5YTI0Y2M2MzMiLCJqdGkiOiI2Y2I1ZGRhNzRhZjNhYTkwNzA3ZjMzMDFiYjBiZDUzNTZjNjYxMGUyZWJlNmYzOTI5NzBmMjNjNDdiNjhjY2FiYjI0ZWVmMzYwZmNiZDBmNyIsImlhdCI6IjE2MDgwODMyNTYuNTE2NjE4IiwibmJmIjoiMTYwODA4MzI1Ni41MTY2MjUiLCJleHAiOiIxNjIzODA4MDU2LjMxMTg5NSIsInN1YiI6IjUiLCJzY29wZXMiOlsiYWRtaW4iXX0.GbKZ8CIjt3otzFyE5aZEkNBCtn75ApIfS6QbnD6z0nxDjycknQaQYz2EGems9Z3Qjabe5PA9zL1mVnycCieeQfpLvWL9xDu9hKkIMs006Sznrp8gWy6JK8qX4Xx3GkzWEx8Z7ZZmhsKUgEyRkqnKJ-1BqC2tTiTBqBAO6pK_Pz7H74gV95dsMiys9afPKP5ztW93kwaC-pj4h-vv-GftXXc6XDnUhTppT4qxn1r2Hf7k-NXE_IHq4ZPb20LRXboH0RnbJgq2JA1E3WFX5_a6FeWJvLlLnGGNOT0ocdNZq7nTGWwfocHlv6pH0NFaKa3hLoRh79d5KO_nysPVCDt7jYOMnpiq8ybIbe3oYjlWyk_rdQ9067bnsfxyexQwLC3IJpAH27Az8FQuOQMZg2HJhK8WtWUph5bsYUU0O2uPG8HY9922yTGYwzeMEdAqBss85jdpMNuECtlIFM1Pc4S-0nrCtBE_tNXn8ATDrm6FecdSK8KnnrCOSsZhR04MvTyznqCMAnKtN_vMDpmIAmPd181UanjO_kxR7QIlsEmT_UhM1MBmyfdIEvHkgLgUdUouonjQNvOKwCrrgDkP0hkZQff-iuHPwpL-CUjw7GPa70lp-TIDhfei8T90RkAXte1XKv7ku3sgENHTwPrL9QSrNtdc5MfB9AbUV-tFMJn9T7k
      

      【讨论】:

        【解决方案8】:

        这很简单,对我有用...

        只需将 PHP 变量传递到单引号中...

        <script>
            var collection = '{{ $collection }}';
        </script>
        

        【讨论】:

          【解决方案9】:

          在控制器中

           $langs = Language::all();
           return View::make('NAATIMockTest.Admin.Language.index',compact('langs'))
          

          有时您可能会将数组传递给您的视图,以将其呈现为 JSON 以初始化 JavaScript 变量。

          可见

          <script>
              var app = <?php echo json_encode($langs); ?>;
              console.log($langs);
          </script>
          

          这里是官方参考enter link description here

          【讨论】:

            【解决方案10】:

            查看

            <script>  
                   var langs = JSON.parse({!! json_encode($langs) !!});
            </script>
            

            【讨论】:

              猜你喜欢
              • 2022-06-30
              • 1970-01-01
              • 2016-06-14
              • 2018-04-07
              • 2011-05-09
              • 2018-12-03
              • 2016-09-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多