根据页面

时间:2016-06-07 08:47:35

标签: javascript php laravel

我正在尝试优化laravel上所有页面的负载,因此我只想在使用它们的页面上加载js文件。

我最终得到了所有的公共js文件和其他3个特定文件的js。像这样:

mix   //.scriptsIn('resources/assets/js');
    .scripts([
      // commons
          // cdn
          // 'bootstrap.min.js',
          // 'jquery.min.js',
          'scripts.js',
          'template.js',
      ]);

mix.version(["css/all.css", "js/all.js"]);

elixir(function(mix) {
    mix.scripts([
// welcome page
            'wow.js',
            'jquery.lazyloadxt.extra.min.js',
            // jquery.easing.min.js  // unused
          ], "public/js/welcome.js", 'resources/assets/js');
    mix.version(["js/welcome.js"]);

    mix.scripts([
// chart pages
            'highcharts.js',
            'jquery.highchartTable-min.js',
            ], "public/js/charts.js", 'resources/assets/js');
    mix.version(["js/charts.js"]);

    mix.scripts([
//table pages
            'jquery.tablesorter.min.js',
          ], "public/js/tables.js", 'resources/assets/js');
    mix.version(["js/tables.js"]);

});

所以我将all.js放在主视图上,而我想要做的是将另一个包含在我想要的页面上。 tables.js仅在有表的页面上,依此类推。

我是否可以在不必手动将脚本标记放在各个视图上的情况下执行此操作?

我在考虑设置服务提供商并检查变量吗?

public function boot()
{
    // view()->composer('master', function ($view) {
    //     $view->with('js_include', 'table.js');
    // });
}

在主视图中,如果存在,包括?一个页面可能有表格和图表,所以我必须做一个foreach。我是不是太复杂了?

2 个答案:

答案 0 :(得分:0)

您可以为每个JS脚本编写自定义指令,并在模板中包含创建的标记名称。

class BladeServiceProvider extends ServiceProvider {
    public function boot()
    {
        Blade::directive('chartsjs', function($expression) {
            return "<?php
               echo '<script type=...>...</script>';
        });     
   } 

   //...
}

// view template: example.blade.php

@section('js')
     @chartsjs
@stop

答案 1 :(得分:0)

好的我正在做:

public function boot()
{
    $welcome = ['home'];
    $charts = ['meal.*'];
    $tables = ['meal.*', 'trainings.*', 'plans.*', 'nutrition.index',
          'history.index', 'exercises.index'];

    $pages = array_merge($welcome, $charts, $tables);

    foreach ($pages as $key => $page) {
      $js_includes = [];
      foreach (['welcome', 'charts', 'tables'] as $key => $value) {
        if (in_array($page, $$value)) $js_includes[] = "js/{$value}.js";
      }

      View::composer($page, function ($view) use ($js_includes) {
          $view->with('js_include', $js_includes);
      });
    }
}

仅在主视图中:

@if (isset($js_include))
  @foreach($js_include as $key => $js)
    <script src="/{{ $js }}"></script>    
  @endforeach
@endif

它适用于localhost,但不适用于heroku deploy:/

我为view()->composer更改了View::composer并添加了use View;但同样的问题

评论//protected $defer = true;解决了问题