2015-05-16 5 views
9

Я пытаюсь получить динамические выпадающие списки, работающие с Laravel и Select2. Есть два выпадающих списка; один для компаний, т. е. «компания2», и один для мест, принадлежащих этой компании, то есть «location2».Динамические выпадающие списки с использованием select2, json request и Laravel

В течение жизни я не могу понять, как заставить «company2» выпустить событие, чтобы прочитать, что компании расположены, если он изменился! Что я делаю неправильно в разделе javascript этого кода! (все остальное работает)

Маршрут

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

Controller (ApiController)

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

Пример вывода из адреса "API/локаций/7"

{"Yellowstone":"8"} 

View (форма открыта/закрыть раздел)

{!! 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> 

мнение передается список активных компаний при инициализации т.е.

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

Я вы не использовали select2 раньше, но закодировали эту скрипту после того, как быстрый взгляд на документы, и в нем есть пример способа запуска функции в событии изменения. http://jsfiddle.net/oy14tdus/ - это помогает? Я не уверен, что вам нужно переместить вашу '$ ('. Company2'). Select2(). On ('change'' ... событие/слушатель в функцию готовности документа - возможно, сделайте снимок – haakym

+0

извините, если я Если вы неправильно поняли, у вас возникли проблемы с тем, чтобы запустить событие или у вас возникли проблемы с обновлением значений раскрывающегося списка местоположений при изменении раскрывающегося списка компании? Кроме того, вы, похоже, не передаете свое событие ajax a функция успеха, вам нужно что-то сделать с данными, которые вы получаете, - это то, что вам не хватает? – haakym

+0

@haakym Извините, да, событие изменения отлично срабатывает, мне нужно знать, как передавать данные с маршрута на выпадающее меню «location2» –

ответ

8

Замените JavaScript с нижеследующим, возможно, потребуется изменить некоторые его , Пожалуйста, ознакомьтесь с комментариями.

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

Измените следующие, когда вы захватить данные о местоположении от контроллера

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

Не может показаться, что ваше решение работает? Поле select2 больше не может выбирать что-либо, а переменные «company2»/«data» отображаются как неопределенные? –

+0

Извините, данные ajax 'должны быть пустыми, поскольку вы передаете параметр в URL-адресе - см. Обновление, случайно включив его при копировании с скрипки. Но это не должно быть серьезной проблемой. Вы получаете ошибки javascript? Вы проверили эту скрипку: jsfiddle.net/L8su2/878? – haakym

+0

ajax type также должен быть доставлен, ничего себе извините за все, что я пропустил! – haakym

1

вы можете попробовать это:

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

пример вывода 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"} 
Смежные вопросы