【问题标题】:Selected option on select2 using Ajax Autocomplete使用 Ajax 自动完成在 select2 上选择的选项
【发布时间】:2020-08-11 07:27:54
【问题描述】:

我正在尝试使用 Laravel 和 Blade 的 Select2 和 Ajax 自动完成功能在选择框中选择一个值。我只在编辑模式下遇到问题(当我已经在 DB 上有一个值时)并且它在插入模式下没有问题。 这是我的选择为空的html代码:

<select class="form-control" id="city-name" name="city" style="width: 100%">
    {{ isset($indirizzi->city_id) ? "<option value=\"". $indirizzi->city->id ."\" selected>".$indirizzi->city->name."</option>" : "" }}
</select>

这是我的 javascript 代码,我从数据库中获取值并创建一个新的选项值:

<script>
    var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');

    @if(isset($indirizzi))
        var newOption = new Option('{{ $indirizzi->city->name }}', '{{ $indirizzi->city->id }}', true, true);
        var txtOption = '<option value="{{ $indirizzi->city->id }}" selected>{{ $indirizzi->city->name }}</option>';
        $('#city-name').append(txtOption).val('{{ $indirizzi->city->id }}');
        $('#city-name').select2().trigger('change');
    @endif

    $().ready(function () {
        $("#city-name").select2({
            ajax: {
                url: "{{ route("ajaxFindCity") }}",
                dataType: 'json',
                delay: 250,
                type: "POST",
                data: function (params) {
                    return {
                        _token: CSRF_TOKEN,
                        city: params.term
                    };
                },
                processResults: function (data) {
                    return {
                        results: data
                    };
                },
                error: function (data) {
                    showException(data);
                },
                cache: true
            },
            minimumInputLength: 3,
            templateSelection: function (data) {
                return data.city;
            }
        });
    });
</script>

但在加载页面时,我可以在我的选择框中看到所选值,但无法搜索新值...

如果我不在编辑视图中,这是 route("ajaxFindCity") 中的函数代码:

public function ajaxFind(Request $request)
{
    // Recupero la città da ricercare
    $city = $request->get("city");
    // Recupero le città che rientrano nella mia ricerca
    $cities = City::with('province')->where('cities.name', 'like', $city . '%')->get();
    $result = [];
    foreach ($cities as $city) {
        $result[] = [
            "id" => $city->id,
            "text" => $city->name . " (" . $city->province->code . ")",
            "city" => $city->name,
            "province" => $city->province->code
        ];
    }
    return response()->json($result);
}

【问题讨论】:

  • 您是否收到任何 Javascript 错误?你能添加你的route("ajaxFindCity") 的代码吗?
  • 如果我加载页面时没有从数据库中获取旧值(所以我必须第一次选择城市),Select2 有效。我添加了你在我的问题中问我的函数的代码。
  • 感谢代码 - 如果您已经拥有 &lt;option value="3620194" selected="selected"&gt;select2/select2&lt;/option&gt;,则无需通过 JS 添加选项,因此您可以删除 @if(isset($indirizzi)) 条件。
  • 我会提交一个答案,只是为了让我的代码更清晰

标签: php ajax laravel jquery-select2 laravel-blade


【解决方案1】:

如默认值 (https://select2.org/data-sources/ajax#default-pre-selected-values) 文档中所示,您需要删除额外代码:

@if(isset($indirizzi)
  ...
@endif

并将您的选择替换为:

<select class="form-control" id="city-name" name="city" style="width: 100%">
@if($indirizzi)
   <option value="{{ $indirizzi->city_id }}" selected="selected"> {{ $indirizzi->city->name }}</option>
@endif
</select>

【讨论】:

  • 非常感谢!我从脚本中删除了我的额外代码,并按照你告诉我的方式更改了我的选择。当我加载页面时,我可以在选择框中看到名称,但它会立即被空值覆盖。但如果我查看源代码,我可以看到:&lt;select class="form-control select2-hidden-accessible" id="city-name" name="city" style="width: 100%" data-select2-id="city-name" tabindex="-1" aria-hidden="true"&gt; &lt;option value="1808" selected="selected" data-select2-id="4"&gt;Catania&lt;/option&gt; &lt;/select&gt;
  • 我怀疑cache: true 是问题
  • 我需要在哪里检查?
  • 只需从您的 javascript 中删除行 cache: true 并重试
  • 不,很遗憾没有任何改变
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多