2015-05-16 14 views
9

Sto cercando di ottenere dropdown dinamici lavorando con Laravel e Select2. Ci sono due drop down; uno per le aziende, ad esempio "company2" e uno per le sedi che appartengono a tale società, ad esempio "location2".Elenchi a discesa dinamici utilizzando select2, json request e Laravel

Per la vita di me, non riesco a capire come far scoppiare la "company2" a un evento per leggere le sedi delle aziende, se è cambiato! Cosa sto facendo male nella sezione javascript di questo codice! (tutto il resto funziona)

rotta

Route::controller('api', 'ApiController'); 

Controller (ApiController) uscita

public function getLocations($companyId) 
{ 
    return Location::where('company_id', $companyId)->lists('id', 'name'); 
} 

Esempio dall'indirizzo "api/luoghi/7"

{"Yellowstone":"8"} 

View (forma aperta/close section omitted)

{!! Form::select('company_id', $companies, null, ['class' => 'company2 form-control']) !!} 
{!! Form::select('location_id', $locations, null, ['class' => 'location2 form-control']) !!} 

View (Javascript)

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".company2").select2(); 
     $(".location2").select2(); 
    }); 

$(".company2").select2().on('change', function() { 
    var $company2 = $('.company2'); 
    $.ajax({ 
     url:"../api/locations/" + $company2.val(), 
     type:'GET', 
     success:function(data) { 
      var $location2 = $(".location2"); 
      $location2.empty(); 
      $.each(data, function(value, key) { 
       $location2.append($("<option></option>").attr("value", value).text(key)); 
      }); 
      $location2.select2(); 
     } 
    }); 
}).trigger('change'); 
</script> 

La vista è passato un elenco di aziende attive se inizializzato cioè

$companies = Company::lists('trading_name', 'id'); 
+0

I' Non ho usato select2 prima ma ho codificato questo violino dopo averlo fatto una rapida occhiata ai documenti e ha un esempio di come attivare una funzione su un evento di cambiamento. http://jsfiddle.net/oy14tdus/ - ti aiuta? Non sono sicuro se hai bisogno di spostare il tuo '$ ('. Company2'). Select2(). On ('change'' ... event/listener nella funzione di pronto documento - forse dargli un colpo – haakym

+0

scusa se Hai frainteso, stai avendo problemi a far scoppiare l'evento o stai avendo problemi su come aggiornare i valori del dropdown della posizione quando il dropdown della società è stato modificato? Inoltre, non sembra che tu stia passando il tuo evento ajax a funzione di successo, devi fare qualcosa con i dati che stai ricevendo - è questo che ti manca? – haakym

+0

@haakym scusa, sì, l'evento di cambiamento sta funzionando bene, ho bisogno di sapere come passare i dati dal percorso a il dropdown "location2" –

risposta

8

Sostituisci il tuo javascript con la seguente, potrebbe essere necessario modificare alcuni di essi . Si prega di assicurarsi di guardare attraverso i commenti.

var $company2 = $('.company2'); 
var $location2 = $(".location2"); 

$company2.select2().on('change', function() { 
    $.ajax({ 
     url:"../api/locations/" + $company2.val(), // if you say $(this) here it will refer to the ajax call not $('.company2') 
     type:'GET', 
     success:function(data) { 
      $location2.empty(); 
      $.each(data, function(value, key) { 
       $location2.append($("<option></option>").attr("value", value).text(key)); // name refers to the objects value when you do you ->lists('name', 'id') in laravel 
      }); 
      $location2.select2(); //reload the list and select the first option 
     } 
    }); 
}).trigger('change'); 

Change quanto segue quando si afferra i dati di localizzazione dal controller

public function getLocations($companyId) 
{ 
    return Location::where('company_id', $companyId)->lists('name', 'id'); 
} 
+0

Non riesci a far funzionare la tua soluzione? La casella select2 non può più selezionare nulla e le variabili "company2"/"data" vengono visualizzate come indefinite? –

+0

Mi spiace che i dati di ajax 'siano vuoti mentre stai passando il parametro nell'url - vedi l'aggiornamento, incluso accidentalmente quando si copia la copia dal fiddle. Ma questo non dovrebbe essere un grosso problema. Stai ottenendo errori javascript? Hai controllato questo violino: jsfiddle.net/L8su2/878? – haakym

+0

tipo di Ajax dovrebbe anche essere get, wow mi dispiace per tutte le cose che ho perso! – haakym

1

si può provare questo:

$.getJSON("getOptions.php", function (json) { 
     $("#inputs").select2({ 
     data: json, 
     width: "180px" 
     }); 
}); 

esempio uscita JSON:

{id:0,text:"Text 1"}, 
    {id:1,text:"Text 2"}, 
    {id:2,text:"Text 3"}, 
    {id:3,text:"Text 4"}, 
    {id:4,text:"Text 5"} 
Problemi correlati