Laravel and PJAX


Laravel and PJAX

无论如何我都无法让Pjax与Laravel一起工作。我什么都试过了,就是刀刃的模板搞砸了。当我不使用刀片模板时,我可以让它工作。

发生的事情是AJAX页面加载,然后不幸的是,有一个重定向到相同的URL。因此,页面加载两次。

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

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

应用程序/供应商/AppServiceProvider.php

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

应用/中间件/PjaxCheck.php

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

(别忘了把它加到你的Kernel)

资源/视图/布局/main.blade.php

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

资源/视图/布局/pjax.blade.php

@yield('content')
<<p> 视图/strong>
@extends($layout)
@section('content')
    Some html content
@endsection

基本上在AppServiceProvider中,您告诉每个视图$layout变量应该默认为layouts.main。在Pjax中间件中,您可以使用layouts.pjax来覆盖该变量。

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

对于那些担心3.5秒页面加载缓慢并使PJAX无用的人,请注意,在生产服务器上,即使是EC2微实例,你的Laravel应用程序加载时间将是它在Vagrant上的1/10,所以你将在350毫秒范围内,使用PJAX默认的650毫秒超时将没有问题。

可以使用以下代码

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

timeout: ajax超时时间(毫秒)

fragment:要从ajax响应中提取的片段的CSS选择器