我已成功采用了本指南:https://laraget.com/blog/how-to-create-an-ajax-pagination-using-laravel可以满足我的需要,它可以工作,但是如果应用自定义过滤器,则分页将不起作用。
让我们从routes / web.php开始:
// products routes
Route::get('products', 'ProductController@index')->name('CatalogIndex');
// sorting products with custom filters
Route::post('products', 'ProductController@Filters');
然后我们要转到ProductController.php:
public function index(Request $request)
{
$products = Product::orderBy('created_at', 'desc')->paginate(12);
if ($request->ajax()) {
$products_view = view('includes.products', compact('products'))->render();
return response()->json(compact('products_view'));
}
return view('catalog.index', compact('products', 'power', 'area', 'source'));
}
// filtering products
public function Filters(Request $request, Product $product)
{
if ($request->ajax()) {
// using query builder here
$prods = $product->newQuery();
// sorting by price
if ($request->has('order')) {
if ($request->input('order') == 'default') {
$prods->orderBy('created_at', 'desc');
} else {
$prods->orderBy('price', $request->input('order'));
}
}
// more filters omitted for readability
$products = $prods->paginate(12);
$products_view = view('includes.products', compact('products'))->render();
return response()->json(compact('products_view'));
}
return abort(403, 'Unauthorized action.');
}
一些使这些过滤器起作用的javascript:
$('body').on('click', '.pagination a', function(e) {
e.preventDefault();
var url = $(this).attr('href');
getProducts(url);
window.history.pushState("", "", url);
});
function getProducts(url) {
$.ajax({
method: 'get',
url: url,
success: function(data) {
$('#products').html(data.products_view);
console.log(data);
},
error: function(jqxhr, status, exception) {
console.log('Error' + exception);
}
});
}
现在是问题,如果我不应用任何过滤器,但如果应用过滤器(选择电源等于某物的所有产品,等等),那么当我单击a时,使用ajax进行常规分页就可以了分页链接,它只会导致我在第二页上的ProductController的索引方法忽略我的过滤器,还将url更改为“ products?page = 2”,我期望以下行为->当您应用源过滤器== somevalue时,然后单击第二页,将显示所有应用了源过滤器的产品的第二页,现在仅显示索引方法,并按created_at列进行简单排序。
答案 0 :(得分:1)
您需要:
刀片上的像这样在分页器上附加addicional参数:
{!! $products->appends(['param1' => 'val1', 'param2'=>'val2'])->links() !!}
然后在方法index()上执行该操作:
if ($request->ajax()) {
return $this->filters($request, $product);
}
祝你好运。
答案 1 :(得分:0)
您的http方法不匹配。尝试将路线更改为“获取”而不是“发布”,看看是否可以解决
答案 2 :(得分:0)
使用查询字符串结束并切换到GET方法。