在 Ajax 和 Laravel 的帮助下,根据另一个 select 标签更新选项 select 属性?
Update options select attributes according to the other select tag with the help of Ajax and Laravel?
我有 select 标签和一系列选项 select 属性,它们的值和内部文本存储在数据库中。
这是我在视图中显示数据的方式,通过为每个 select 标签调用一个 foreach,总共 2 个:
{!! Form::label('category_id', 'Category:') !!}
<select class="form-control category_id" name="category_id">
@foreach($categories as $category)
<option value='{{ $category->id }}'> {{ $category->name }}</option>
@endforeach
</select>
{!! Form::label('subcategory_id', 'Subcategory:') !!}
<select class="form-control" name="subcategory_id" label="Subcategory">
@foreach($subcategories as $subcategory)
<option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
@endforeach
</select>
问题是,我坚持以下想法:类别和子类别是一对多关系,这意味着当用户单击某个类别时,select 子类别应该是仅填充与所选类别相关联的值。
我怎样才能找到这个问题的解决方案,我正在考虑创建一个 ajax 请求,但我不知道如何填充选项 select 属性。或者创建一个 JSON(前端的所有工作)变量来存储子类别,并根据用户选择的类别更新 select 标签。
任何帮助将不胜感激。
解决方案:
查看:
{!! Form::label('category_id', 'Category:') !!}
<select class="form-control" id="categories" name="category_id">
@foreach($categories as $category)
<option value='{{ $category->id }}'> {{ $category->name }}</option>
@endforeach
</select>
<div id="displayCategories" style="display:none">
{!! Form::label('subcategory_id', 'Subcategory:') !!}
<select class="form-control" id="subcategories" name="subcategory_id" label="Subcategory">
@foreach($subcategories as $subcategory)
<option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
@endforeach
</select>
</div>
JS & JQUERY & AJAX:
<script
src="https://code.jquery.com/jquery-3.1.1.js"
integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
crossorigin="anonymous"></script>
<script>
$('#categories').on('change',function(e) {
var cat_id = e.target.value;
//ajax
$.ajax({
url: '../ajax-subcat/{cat_id}', //note:that the path can be different for different purpose used, in a simple page -> '/ajax-subcat/{cat_id}' so use the console of your browser
type: 'GET',
data: {cat_id : cat_id},
success: function(response)
{
$('#subcategories').empty();
$('#displayCategories').show();
$.each(response, function(index, subcatObj) {
$('#subcategories').append('<option value="' + subcatObj.id + '">' + subcatObj.name + '</option>');
console.log(subcatObj);
});
}
});
});
</script>
路线:
Route::get('ajax-subcat/{cat_id}', 'PostController@getAjax');
控制器:
public function getAjax()
{
$cat_id = Input::get('cat_id');
$subcategories = Subcategory::where('category_id', '=', $cat_id)->get();
return Response::json($subcategories);
}
别忘了在controller中引入对应的模型,Input和Response的facades。 以我为例:
use Illuminate\Support\Facades\Input;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;
use App\Category;
use App\Subcategory;
您没有提及您使用的 Laravel 版本,因此实现可能略有不同。您可以通过 ajax 方法来完成。您可以查看 Axios 的前端调用,但您需要在 select 元素上设置事件侦听器,以便用户创建新的 selection.
我有 select 标签和一系列选项 select 属性,它们的值和内部文本存储在数据库中。
这是我在视图中显示数据的方式,通过为每个 select 标签调用一个 foreach,总共 2 个:
{!! Form::label('category_id', 'Category:') !!}
<select class="form-control category_id" name="category_id">
@foreach($categories as $category)
<option value='{{ $category->id }}'> {{ $category->name }}</option>
@endforeach
</select>
{!! Form::label('subcategory_id', 'Subcategory:') !!}
<select class="form-control" name="subcategory_id" label="Subcategory">
@foreach($subcategories as $subcategory)
<option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
@endforeach
</select>
问题是,我坚持以下想法:类别和子类别是一对多关系,这意味着当用户单击某个类别时,select 子类别应该是仅填充与所选类别相关联的值。
我怎样才能找到这个问题的解决方案,我正在考虑创建一个 ajax 请求,但我不知道如何填充选项 select 属性。或者创建一个 JSON(前端的所有工作)变量来存储子类别,并根据用户选择的类别更新 select 标签。
任何帮助将不胜感激。
解决方案:
查看:
{!! Form::label('category_id', 'Category:') !!}
<select class="form-control" id="categories" name="category_id">
@foreach($categories as $category)
<option value='{{ $category->id }}'> {{ $category->name }}</option>
@endforeach
</select>
<div id="displayCategories" style="display:none">
{!! Form::label('subcategory_id', 'Subcategory:') !!}
<select class="form-control" id="subcategories" name="subcategory_id" label="Subcategory">
@foreach($subcategories as $subcategory)
<option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
@endforeach
</select>
</div>
JS & JQUERY & AJAX:
<script
src="https://code.jquery.com/jquery-3.1.1.js"
integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
crossorigin="anonymous"></script>
<script>
$('#categories').on('change',function(e) {
var cat_id = e.target.value;
//ajax
$.ajax({
url: '../ajax-subcat/{cat_id}', //note:that the path can be different for different purpose used, in a simple page -> '/ajax-subcat/{cat_id}' so use the console of your browser
type: 'GET',
data: {cat_id : cat_id},
success: function(response)
{
$('#subcategories').empty();
$('#displayCategories').show();
$.each(response, function(index, subcatObj) {
$('#subcategories').append('<option value="' + subcatObj.id + '">' + subcatObj.name + '</option>');
console.log(subcatObj);
});
}
});
});
</script>
路线:
Route::get('ajax-subcat/{cat_id}', 'PostController@getAjax');
控制器:
public function getAjax()
{
$cat_id = Input::get('cat_id');
$subcategories = Subcategory::where('category_id', '=', $cat_id)->get();
return Response::json($subcategories);
}
别忘了在controller中引入对应的模型,Input和Response的facades。 以我为例:
use Illuminate\Support\Facades\Input;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;
use App\Category;
use App\Subcategory;
您没有提及您使用的 Laravel 版本,因此实现可能略有不同。您可以通过 ajax 方法来完成。您可以查看 Axios 的前端调用,但您需要在 select 元素上设置事件侦听器,以便用户创建新的 selection.