Как я могу вернуть представление из вызова AJAX в Laravel 5?
Я пытаюсь вернуть html-таблицу для вызова ajax.
маршрут:
Route::post('job/userjobs', '[email protected]');
ajax на вызывающей странице:
function getUserJobs(userid) {
$_token = "{{ csrf_token() }}";
var userid = userid;
$.ajax({
headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') },
url: "{{ url('/job/userjobs') }}",
type: 'POST',
cache: false,
data: { 'userid': userid, '_token': $_token }, //see the $_token
datatype: 'html',
beforeSend: function() {
//something before send
},
success: function(data) {
console.log('success');
console.log(data);
//success
//var data = $.parseJSON(data);
if(data.success == true) {
//user_jobs div defined on page
$('#user_jobs').html(data.html);
} else {
$('#user_jobs').html(data.html + '{{ $user->username }}');
}
},
error: function(xhr,textStatus,thrownError) {
alert(xhr + "\n" + textStatus + "\n" + thrownError);
}
});
}
//on page load
getUserJobs("{{ $user->id }}");
:
public function userjobs() {
$input = Request::all();
if(Request::isMethod('post') && Request::ajax()) {
if($input['userid']) {
$userjobs = Userjob::select('select * from user_jobs where user_id = ?', array($input['userid']));
if(! $userjobs) {
return response()->json( array('success' => false, 'html'=>'No Jobs assigned to ') );
}
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs);
return response()->json( array('success' => true, 'html'=>$returnHTML) );
}
}
}
:
@section('content')
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
@stop
Я не получаю ничего в данных json.html. ничего. Если в контроллере я говорю:
return response()->json( array('success' => true, 'html'=>'<span>html here</html>') );
Это работает отлично.
Как я могу вернуть представление из вызова ajax в Laravel 5.
Ответы
Ответ 1
Функция view()
просто создает экземпляр класса View
. Не только HTML-строка. Для этого вы должны называть render()
:
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render();
return response()->json(array('success' => true, 'html'=>$returnHTML));
Ответ 2
используйте функцию строки перед именем файла вида, например
return (String) view('Company.allUserAjax');
Ответ 3
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content'];
Таким образом, этот вопрос старый, и самый верный ответ не решает проблему для меня и для меня. Я столкнулся с той же проблемой, и мне потребовалось два дня, чтобы найти решение. Повсюду я искал ответы на упомянутое использование ->render()
. Но ничего не вернулось. У меня есть частичная точка зрения, которую я хотел включить. Я не расширил свое частичное представление или дал ему название раздела. Так как это необязательно, если включить его в файл с клиентом с директивой include.
Таким образом, решение состоит в том, чтобы заключить ваш html внутри раздела и вместо render()
использовать renderSections()['sectionname']
. Просто использование render()
не будет работать.
Надеюсь, это сбережет кого-нибудь какое-то время и разочарование!
Ответ 4
если ваш аякс правильный, и вы получаете результаты из своей базы данных
$returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
return response()->json( array('success' => true, 'html'=>$returnHTML) );
Ответ 5
Не возвращайте свое представление как JSON, просто верните представление с вашего контроллера. Например:
$view = view("<your url>",compact('data'))->render();
return $view;
Это будет работать точно.
Ответ 6
Хорошо. Я обнаружил по пробным версиям и ошибкам, что вы не включаете команды шаблона лезвия в файл вида, чтобы это работало.
У меня было:
@section('content')
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
@stop
и теперь он работает с:
<table class="table table-striped">
<tbody>
<?php foreach ($userjobs as $userjob){?>
<tr>
<td><strong><?php echo $userjob->title; ?></strong><br />
<?php echo $userjob->description; ?>
</td>
</tr>
<?php } ?>
</table>
Altho я search - я никогда не нашел документацию, в которой говорится об этом.
Ответ 7
удалите это условие if и посмотрите, работает ли он
if(Request::isMethod('post') && Request::ajax()) {
Ответ 8
idk, если вы все еще ищете ответ, но я столкнулся с той же проблемой, что и вы, он продолжал возвращать пустое. ключом к успеху было удаление части @section @endsection в частичном представлении
Ответ 9
Это помогло мне:
echo view('ajaxView')->with(['value' => 'some value']);
Я использовал эхо- представление ('ajaxView') вместо возврата ('ajaxView').
Ответ 10
Я получил это работает без них: @section & @stop
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
или
$returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
или это
$returnHTML = view('job.userjobs',compact($userjobs))->render();// or method that you prefere to return data + RENDER is the key here'
оба работали
Ответ 11
$view = view("job.userjobs",compact($userjobs))->render();
return response()->json(['html'=>$view]);
Ответ 12
Если вы используете AJAX в Laravel, то, когда вы хотите отобразить представление с ответом AJAX, не используйте команду return, а используйте команду echo.
Например, не используйте:
return view('ajax', ['ajax_response'=> $response]);
использование:
echo view('ajax', ['ajax_response'=> $response]);
Другой пример, не используйте:
$view = view("job.userjobs",compact($userjobs))->render();
return response()->json(['html'=>$view]);
использование:
$view = view("job.userjobs",compact($userjobs))->render();
echo response()->json(['html'=>$view]);