[英]Laravel refresh data after ajax
他目前正在研究必須過濾表中數據的代碼。 Ajax將調用該鏈接並獲得響應(json)結果和答案。 但是,我遇到了一個問題。 我必須以某種方式呈現表格,我不想通過追加等來做到這一點。
我可以以某種方式再次生成視圖或刀片文件?
默認視圖是DefController @ index但是ajax使用url哪個控制器是DefController @ gettabledata。
public function gettabledata($id){
return response()->json(Def::find($id)->getallmy->all());
}
您可以將模板中的部件放在與單獨的.blade.php
文件中對應的表中,並將@include
放在主布局中。
main.blade.php
:
<html>
...
<body>
<div class="table-container">
@include('table')
</div>
</body>
...
和
table.blade.php
:
<table>
@foreach($rows as $row)
<tr>
<td> $row->title ... </td>
</tr>
@endforeach
</table>
通過這種方式,您可以使用簡單的jQuery $('div.table-container').load(url)
並在您的服務器上呈現並將該部分作為html字符串進行響應。 return view('table', $data)
使用Javascript:
function refreshTable() {
$('div.table-container').fadeOut();
$('div.table-container').load(url, function() {
$('div.table-container').fadeIn();
});
}
答案是肯定的,你可以。 Webinan當然指出了正確的方向。 這種方法略有不同。
首先,您需要為表格提供單獨的視圖。 HTML標記的一個非常基本的示例:
<div class="table-container">
@include('partials.table') // this view will be async loaded
</div>
我們首先使用簡寫ajax函數使用jQuery調用服務器(也可以使用Javascript完成): var $request = $.get('www.app.com/endpoint');
。 您還可以將任何數據傳遞到后端的控制器。
現在在服務器端,在您的控制器中,渲染並返回表視圖:
class EndpointController extends Controller
{
/**
* Returns a rendered table view in JSON format.
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function ajax(Request $request)
{
$html = view('partials.table', compact('view'))->render();
return response()->json(compact('html'));
}
}
如果一切順利,將觸發done
回調。 只需抓取html變量並將其設置為表容器的內容即可。
function renderTable() {
var $request = $.get('www.app.com/endpoint'); // make request
var $container = $('.table-container');
$container.addClass('loading'); // add loading class (optional)
$request.done(function(data) { // success
$container.html(data.html);
});
$request.always(function() {
$container.removeClass('loading');
});
}
希望這可以幫助!
要在Laravel 5.4中重新加載頁面而更新和更改頁面內容,請執行以下操作:
首先在名為“container.blade.php”的“views”文件夾中創建刀片視圖,它將包含以下代碼(在這種情況下是一個選擇框,它從包Bouncer中呈現一系列功能(但是你可以使用@在你喜歡的任何Laravel系列上預告:)
<select>
{{ $abilityList = Bouncer::role()::where('name','admin')->first()->getAbilities()->pluck('name') }}
@foreach ( $abilityList as $ab )
<option value="{{ $ab }}">{{ $ab }}</option>
@endforeach
</select>
將此添加到您的主刀片文件(例如home.blade.php),確保使用帶有您可以引用的ID的div:
<div id="abilityListContainer">
@include('container')
</div>
現在在您的主刀片文件(例如home.blade.php)上添加一個按鈕,該按鈕將觸發與Laravel控制器通信的功能:
<input type="button" value="reload abilities" onClick="reloadAbilities()"></input>
然后為這個函數添加javascript,這會將生成的html加載到div容器中(注意“.get”旁邊的“/ updateAbility”路徑 - 這是我們將在下一步中設置的Laravel路徑):
var reloadAbilities = function()
{
var $request = $.get('/updateAbility', {value: "optional_variable"}, function(result)
{
//callback function once server has complete request
$('#abilityListContainer').html(result.html);
});
}
現在我們為此操作設置Laravel路由,它引用我們的控制器並調用函數“updateAbilityContainer”。 因此,編輯您的/ routes / web / php文件以具有以下路由:
Route::get('updateAbility', array('as'=> 'updateAbility', 'uses'=>'AbilityController@updateAbilityContainer'));
最后在app / Http / Controllers中創建文件“abilityController.php”(你也可以使用“php artisan make:controller abilityController”)。 現在添加此函數來處理更改,生成html並將其返回到javascript函數(請注意,您可能還必須使用命名空間):
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
class AbilityController extends Controller
{
public function updateAbilityContainer()
{
// use this if you need to retrieve your variable
$request = Input::get('value');
//render and return the 'container' blade view
$html = view('container', compact('view'))->render();
return response()->json(compact('html'));
}
}
多數民眾贊成,當您單擊按鈕時,您的刀片“容器”將重新加載,並且您正在渲染的集合的任何更改都應更新,而無需重新加載頁面。
希望這填補了其他答案留下的一些空白。 我希望這個對你有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.