加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 如何在laravel刀片中进行一次性推送

发布时间:2020-12-14 19:49:03 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用类似于以下(widget.blade.php)的Laravel刀片创建 HTML小部件: @push('scripts') script src="{{ asset('js/foo.js') }}"/script script ... /script@endpush@push('styles') link href="{{ asset('css/bar.css') }}" rel="stylesheet"@endpus
我正在尝试使用类似于以下(widget.blade.php)的Laravel刀片创建 HTML小部件:
@push('scripts')
   <script src="{{ asset('js/foo.js') }}"></script>
   <script>
   ...
   </script>
@endpush
@push('styles')
   <link href="{{ asset('css/bar.css') }}" rel="stylesheet">
@endpush
<div>
... HTML contents
</div>

我在其他刀片中使用小部件,如:

<div>
  ... 
  @include('widget')
</div>
<div>
  ... 
  @include('widget')
</div>

问题是当我在页面中多次使用窗口小部件时,“脚本”和“样式”重复多次.

如何防止Laravel多次推送“脚本”和“样式”?

在下面的回答中,我假设您熟悉 Blade extension.此方法已在Laravel 5.2和5.3上进行了测试(请参阅下面的注释).

在测试Ismail RBOUH’s Answer(所以请阅读它)之后,解决方案似乎有两个问题:

1- $isDisplayed变量与其他包含的小部件不在同一范围内,因此每个@include将其脚本推送到堆栈.结果我将其更改为:

Blade::directive('pushonce',function ($expression) {
    $isDisplayed = '__pushonce_'.trim(substr($expression,2,-2));
    return "<?php if(!isset($__env->{$isDisplayed})): $__env->{$isDisplayed} = true; $__env->startPush{$expression}; ?>";
});
Blade::directive('endpushonce',function ($expression) {
    return '<?php $__env->stopPush(); endif; ?>';
});

2-解决方案将@pushonce的使用限制为一个小部件.即,在2个或更多小部件(widget1.blade.php,widget2.blade.php,…)的情况下,它阻止推送其他小部件脚本.所以,我使用以下代码将域添加到@pushonce:

Blade::directive('pushonce',function ($expression) {
    $domain = explode(':',trim(substr($expression,-2)));
    $push_name = $domain[0];
    $push_sub = $domain[1];
    $isDisplayed = '__pushonce_'.$push_name.'_'.$push_sub;
    return "<?php if(!isset($__env->{$isDisplayed})): $__env->{$isDisplayed} = true; $__env->startPush('{$push_name}'); ?>";
});
Blade::directive('endpushonce',function ($expression) {
    return '<?php $__env->stopPush(); endif; ?>';
});

用法:

widget1.blade.php

@pushonce('scripts:widget1')
   <script src="{{ asset('js/foo.js') }}"></script>
   <script>
   ...
   </script>
@endpushonce

widget2.blade.php

@pushonce('scripts:widget2')
   <script src="{{ asset('js/bar.js') }}"></script>
   <script>
   ...
   </script>
@endpushonce

L 5.3的注意事项:
更改以下行:

$domain = explode(':',-2)));

$domain = explode(':',1,-1)));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读