Laravel 和 PJAX

Laravel and PJAX

我这辈子都无法让 Pjax 与 Laravel 一起工作。我什么都试过了,但 blade 模板搞砸了。当我不使用 blade 模板时,我可以让它工作。

发生的事情是 AJAX 页面加载,然后不幸的是,重定向到完全相同的 URL。所以页面加载了两次。

我不知道如何修改 blade 模板引擎以适应 Pjax 并抑制第二页加载。有人有线索吗?

您如何扩展布局?您基本上需要两种布局才能使 PJAX 正常工作 - 一种包含您的所有脚本和诸如此类的东西,另一种只显示您请求的视图。

app/Providers/AppServiceProvider.php

public function boot() {
    view()->share('layout', 'layouts.main');
}

app/Middleware/PjaxCheck.php

public function handle($request, Closure $next)
{
    if ($request->pjax())
    {
        view()->share('layout', 'layouts.pjax');
    }

    return $next($request);
}

(别忘了将其添加到您的 Kernel

resources/views/layouts/main.blade.php

<html>
    <body>
        @yield('content')
    </body>
</html>

resources/views/layouts/pjax.blade.php

@yield('content')

查看

@extends($layout)
@section('content')
    Some html content
@endsection

本质上,在 AppServiceProvider 中,您告诉每个视图 $layout var 应该默认为 layouts.main。在 Pjax 中间件中,您然后用 layouts.pjax 覆盖该变量。

原始海报在这里。此多重加载问题是由于 Homestead/vagrant 速度慢造成的。如果将 PJAX 上的 timeout 选项设置为 3500 (ms),则不会遇到此问题。

对于那些担心 3.5 秒页面加载速度慢并导致 PJAX 无用的人,请注意,在生产服务器上,即使是 EC2 微实例,您的 Laravel 应用加载时间也将是实际加载时间的 1/10在 Vagrant 上,因此您将处于 350ms 范围内,并且使用 PJAX 及其默认 650ms 超时不会有问题。

您可以使用此代码

$(document).pjax('a', '#pjax-container',{
    timeout : 10000,
    fragment : ".root"
});

timeout : ajax 以毫秒为单位的超时,之后强制进行完全刷新

fragment : CSS 从 ajax response

中提取的片段选择器