Come posso restituire una vista da una chiamata ajax in Laravel 5

Sto cercando di ottenere una tabella html per tornare su una chiamata Ajax.

itinerario:

Route::post('job/userjobs', '[email protected]'); 

ajax sulla pagina di chiamata:

 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 }}"); 

Controller:

 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) ); } } } 

vista:

 @section('content')  @foreach ($userjobs as $userjob)  @endforeach 
{{ $userjob->title }}
{{ $userjob->description }}
@stop

Non riesco a ottenere nulla nei dati di json.html. Niente. Se nel controller dico:

 return response()->json( array('success' => true, 'html'=>'html here') ); 

Questo funziona bene.

Come posso restituire una vista da una chiamata ajax in Laravel 5.

La funzione view() crea solo un’istanza della class View . Non solo una stringa HTML. Per questo dovresti chiamare render() :

 $returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render(); return response()->json(array('success' => true, 'html'=>$returnHTML)); 

usa la funzione stringa prima di visualizzare il nome del file come

 return (String) view('Company.allUserAjax'); 

se il tuo ajax è corretto e stai ottenendo risultati dal tuo DB

  $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) ); 

Ok: ho trovato per tentativi ed errori che non si includono i comandi del modello blade nel file di visualizzazione perché funzioni.

Avevo:

 @section('content')  @foreach ($userjobs as $userjob)  @endforeach 
{{ $userjob->title }}
{{ $userjob->description }}
@stop

e ora sta lavorando con:

 
title; ?>
description; ?>

Altho ho cercato – non ho mai trovato documentazione che lo affermasse.

Non restituire la visualizzazione come JSON, è sufficiente restituire la vista dal controller Ad esempio:

 $view = view("",compact('data'))->render(); return $view; 

Questo funzionerà sicuramente.

rimuovere questo se condizione e vedere se funziona

 if(Request::isMethod('post') && Request::ajax()) { 

idk se stai ancora cercando la risposta, ma mi sono imbattuto nello stesso problema come te, ha continuato a restituire vuoto. la chiave del successo è stata la rimozione della parte @section @endsection nella vista parziale

 $returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content']; 

Quindi questa domanda è vecchia e la risposta più spinta non ha risolto il problema per il richiedente e nemmeno per me. Ho incontrato lo stesso problema e mi ci sono voluti due giorni per trovare la soluzione. Ovunque sono venuto alla ricerca di risposte detto uso ->render() . Ma nulla è tornato. Ho una visione parziale che volevo includere. Non avevo esteso la vista parziale o dato un nome di sezione. Dal momento che questo non è necessario quando lo si include all’interno di un file blade con la direttiva include.

Quindi la soluzione è, racchiudi il tuo html all’interno di una sezione e invece di render() , usa renderSections()['sectionname'] . L’uso di render() non funzionerà.

Spero che questo garantisca a qualcuno un po ‘di tempo e frustrazione!