Как я могу вернуть представление из вызова 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]);