Javascript 在Laravel 5.4中重新加载视图后,如何保留表单中的所有过滤器?

Javascript 在Laravel 5.4中重新加载视图后,如何保留表单中的所有过滤器?,javascript,php,laravel,Javascript,Php,Laravel,我在视图中有以下表格: <form class="form-inline" method="POST" action="{{route('dsp.report')}}"> @csrf <!-- {{ csrf_field() }} --> <div class="col-sm-2 form-group"> <label>Range one: &l

我在视图中有以下表格:

<form class="form-inline" method="POST" action="{{route('dsp.report')}}">
@csrf <!-- {{ csrf_field() }} -->
    <div class="col-sm-2 form-group">
        <label>Range one: </label><input type="text" class="form-control" id="date_from" name="date_from" placeholder="Date from range">
    </div>
    <div class="col-sm-2 form-group">
        <label>Range two: </label><input type="text" class="form-control" id="date_to" name="date_to" placeholder="Date to range">
    </div>
    <div class="col-sm-2 form-group">
        <label>Filter by SSP: </label><select name="ssp_id[]" id="ssp" class="form-control-lg select2" multiple="multiple"></select>
    </div>
    <div class="col-sm-2 form-group">
        <label>Filter by DSP: </label><select name="dsp_id[]" id="dsp" class="form-control-lg select2" multiple="multiple"></select>
    </div>
    <div class="col-sm-2 form-group">
            <label>Group by: </label>
            <select class="form-control" name="groupby">
                <option>SSP/DSP</option>
                <option>SSP</option>
                <option>DSP</option>
            </select>
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>
我怎么做?有什么简单的解决办法吗

UPD:要明确在基于select2的多下拉菜单中保留值(而不是键),请选择:

首先,我们在查找SSP术语时触发此控制器:

public function get_ssp(Request $request) {
    $term = $request->get('term');

    $ssp_list = SspCompanyList::where('ssp_company_name', 'LIKE', '%'. $term['term'] .'%')
        ->get(['ssp_company_id as id', 'ssp_company_name as text']);

    return ['results' => $ssp_list];

}
然后我们在提交后在控制器中处理所选ID。Select2的配置方式如下:

    $(document).ready(function() {
        $('#ssp').select2({
            width: '200px',
            minimumInputLength: 3,
            ajax: {
                url: '{{ route("get_ssp") }}',
                dataType: 'json',
                type: "POST",
                quietMillis: 50,
                data: function (term) {
                    return {
                        term: term
                    };
                },
            },
        });
    });
            <select name="ssp_id[]" id="ssp" class="form-control-lg select2" multiple="multiple">
                @if (is_array(old('ssp_id')))
                    @foreach (old('ssp_id') as $ssp_id)
                        {{ $ssp_name = \App\Models\SspCompanyList::select('ssp_company_name')->where('ssp_company_id', $ssp_id)->first()->ssp_company_name }}
                        <option value="{{ $ssp_name }}" selected="selected">{{ $ssp_name }}</option>
                    @endforeach
                @endif
            </select>
let arrayOfSelectedValues = [] // You can keep your selected values here if you know them already

$('#ssp').select2({
    width: '200px',
    minimumInputLength: 3,
    ajax: {
        url: '{{ route("ssp") }}',
        dataType: 'json',
        type: "POST",
        quietMillis: 50,
        data: function (term) {
            return {
                term: term
            };
        },
    },
}).val(arrayOfSelectedValues).trigger("change"); // Then add the selected values to the select2() initialisation
但问题是select2只发送ssp_id[]中的id,而不是键值项,并且在发送之前无法将它们从old()函数中恢复为项名称

UPD2: 我正试图以这种方式解决这个问题:

    $(document).ready(function() {
        $('#ssp').select2({
            width: '200px',
            minimumInputLength: 3,
            ajax: {
                url: '{{ route("get_ssp") }}',
                dataType: 'json',
                type: "POST",
                quietMillis: 50,
                data: function (term) {
                    return {
                        term: term
                    };
                },
            },
        });
    });
            <select name="ssp_id[]" id="ssp" class="form-control-lg select2" multiple="multiple">
                @if (is_array(old('ssp_id')))
                    @foreach (old('ssp_id') as $ssp_id)
                        {{ $ssp_name = \App\Models\SspCompanyList::select('ssp_company_name')->where('ssp_company_id', $ssp_id)->first()->ssp_company_name }}
                        <option value="{{ $ssp_name }}" selected="selected">{{ $ssp_name }}</option>
                    @endforeach
                @endif
            </select>
let arrayOfSelectedValues = [] // You can keep your selected values here if you know them already

$('#ssp').select2({
    width: '200px',
    minimumInputLength: 3,
    ajax: {
        url: '{{ route("ssp") }}',
        dataType: 'json',
        type: "POST",
        quietMillis: 50,
        data: function (term) {
            return {
                term: term
            };
        },
    },
}).val(arrayOfSelectedValues).trigger("change"); // Then add the selected values to the select2() initialisation

@if(是_数组(旧('ssp_id'))
@foreach(旧(‘ssp_id’)作为$ssp_id)
{{$ssp_name=\App\Models\ssp公司列表::选择('ssp_公司名称')->其中('ssp_公司id',$ssp_id)->first()->ssp_公司名称}
{{$ssp_name}
@endforeach
@恩迪夫
在第一次重新加载后,它工作并保留我需要的ssp名称,但在第二次尝试在同一页面上为下面的dsp选择值并再次提交后,它返回此错误:

正在尝试获取非对象的属性“ssp\u company\u name”(视图: /home/pavel/projects/dsp/resources/views/dsp/index.blade.php)


那么,为什么第一次有效,第二次无效呢?对于select2,我们是否应该以其他方式处理它?

将属性值添加到所有输入中,如下所示:

<input type="text" name="username" value="{{ old('username') }}">

检查文档以便更好地理解

注意: 您忘记在
选择
选项上添加
属性

对于普通输入字段,可以使用
old('Input\u name')将旧值传递给它。

例如:

<input name="input_name" value="{{ old('input_name') }}" />
您的代码变成:

<form class="form-inline" method="POST" action="{{route('dsp.report')}}">
    @csrf <!-- {{ csrf_field() }} -->
    <div class="col-sm-2 form-group">
        <label>Range one: </label>
        <input type="text" class="form-control" id="date_from" name="date_from" value="{{ old('date_from') }}" placeholder="Date from range">
    </div>
    <div class="col-sm-2 form-group">
        <label>Range two: </label>
        <input type="text" class="form-control" id="date_to" name="date_to" value="{{ old('date_to') }}" placeholder="Date to range">
    </div>
    <div class="col-sm-2 form-group">
        <label>Filter by SSP: </label>
        <select name="ssp_id[]" id="ssp" class="form-control-lg select2" multiple="multiple"><option></option></select>
    </div>
    <div class="col-sm-2 form-group">
        <label>Filter by DSP: </label>
        <select name="dsp_id[]" id="dsp" class="form-control-lg select2" multiple="multiple"><option></option></select>
    </div>
    <div class="col-sm-2 form-group">
        <label>Group by: </label>
        <select class="form-control" name="groupby">
            <option {{ old('groupby') == "SSP/DSP" ? 'selected' : '' }} value="SSP/DSP">SSP/DSP</option>
            <option {{ old('groupby') == "SSP" ? 'selected' : '' }} value="SSP">SSP</option>
            <option {{ old('groupby') == "DSP" ? 'selected' : '' }} value="DSP">DSP</option>
        </select>
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>

您可以使用会话存储筛选器数据,也可以在刀片模板中使用会话数据。select2如何选择?flash()/old()对的用法是相同的还是不同的?是的,Select2也可以选择。“value=”some value“-如果我们从本地控制器远程下载值,但不知道确切的值?还有另一个问题——这是一个我们必须以某种方式解包的多重列表。我们应该在blade模板中为此运行foreach吗?很抱歉,我不明白“从本地控制器远程下载值”是什么意思。我的意思是,我们通过laravel controller从本地数据库通过ajax获取select2的这些id/文本对,触发具有类似“%pattern%”sql请求的模型。