ajax – 验证后Laravel Select2旧输入

前端之家收集整理的这篇文章主要介绍了ajax – 验证后Laravel Select2旧输入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的webapplication中使用Select2.我用Ajax加载我的Select2框.验证失败时,除Select2框之外,所有输入都按照之前的方式填充.如何在表单验证失败后恢复旧值?我的赌注是使用Request :: old(‘x’),但这会插入值(在我的情况下是用户ID)而不是所选文本.因此,例如约翰将在选择框中变为27.我怎样才能收回文字
<select id="customer" name="customer" class="searchselect searchselectstyle">
</select>

js:

token = '{{csrf_token()}}';

$(".searchselect").select2({
    ajax: {
        dataType: "json",type: "POST",data: function (params) {
            return {
                term: params.term,'_token': token,'data' : function(){
                    var result = [];
                    var i = 1;
                    $('.searchselect').each(function(){
                        result[i] = $(this).val();
                        i++;
                    });
                    return result;
                }
            };
        },url: function() {
            var type = $(this).attr('id');
            return '/get' + type;
        },cache: false,processResults: function (data) {
            return {
                results: data
            };
        }
    }
});

编辑

到目前为止我发现的唯一(脏)解决方案如下:

<select id="customer" name="customer" class="searchselect searchselectstyle">
    @if(Request::old('customer') != NULL)
        <option value="{{Request::old('customer')}}">{{$customers->where('id',intval(Request::old('customer')))->first()->name}}</option>
    @endif
</select>

$customers是所有客户的列表,因此这意味着对于每个Select2框,我需要查询大项目列表以使其工作.如果我们在每个Select2框中讨论数千行,这将是非常低效的.

我想必须有一个更好的解决方案.谁能帮我?

通常以编程方式设置select2的值,您可能希望使用.val()方法,后跟.trigger(‘change’)调用 as per their documentation(和 other queries like this on SO).但是,select2本身在他们的文档中有关于 preselecting options for remotely sourced data内容.

基本上他们的建议归结为(在初始化你的AJAX驱动< select>)之后:

>使用预先选择的ID对新的API端点进行另一次AJAX调用
>动态创建一个新选项并附加到底层< select>在AJAX调用完成后,从promise函数(.then())开始

>也可以使用一些常规的jQuery回调链接函数

>触发更改事件
>触发select2:select事件(并传递整个数据对象)

假设您已经以各种方式将旧数据闪存到会话,Laravel provides handy access to the previously requested input,特别是这三个:

>通过Request类进行静态访问,例如在OP中请求:: old(‘customer’)
>全球old() helper,例如old(‘customer’),如果给定字段没有旧输入,则返回null,并且可以将默认值作为第二个参数
>在控制器的Request实例上使用old()方法,例如$请求 – >老( ‘顾客’)

全局辅助方法更常被建议在Blade模板中使用,就像在这里的一些其他答案中一样,当你不需要操作值并且可以直接将其插回时,它非常有用,你可以使用文字输入.

最后一种方法可能为您提供了您正在寻找的答案 – 而不是从视图内部查询整个集合,您可以从控制器中操作集合(类似于OP,但是应该更好,因为它不是在视图中解析它)或者根据旧ID从控制器发出另一个查询获取所需的数据而不必搜索集合(更少的开销):

$old_customer = Customer::find($request->old('customer'));

无论哪种方式,在刀片模板处理任何内容之前,您都可以在指尖(作为视图变量)获得特定数据.

但是,如果您选择注入数据,它仍将遵循select2建议的模式:

>获取预先选择的数据
>为它创建一个选项
>触发相应的事件

唯一的区别是您不需要从另一个API端点获取数据(除非您需要/需要其他程序原因).

猜你在找的Ajax相关文章