Как повторно использовать уже запущенный почтовый запрос jquery ajax для функции автозаполнения? - PullRequest
0 голосов
/ 20 мая 2018

У меня есть ссылка "Показать города", при нажатии на которую появляется модальное изображение с некоторыми городами:

<a class="city" id="showCities" 
 data-toggle="modal" data-target="#modal2" href=""> Show cities</a>

Когда пользователь нажимает на город внутри модального окна, модальное окно закрывается и в "#conferences "div - это конференции, для которых столбец" город "в таблице конференций равен выбранному городу.Это нормально работает с запросом ajax.

Сомнение:

Я сомневаюсь, потому что я хотел бы повторно использовать эту часть кода, запрос ajax, дляавтозаполнение поискового ввода с идентификатором "#search".Когда пользователь пишет, например, «Ne» в этом автозаполнении ввода, появляется Newcastle.Это работает нормально.

Но когда пользователь щелкает в Ньюкасле, в div "#conferences" должны появиться конференции, в которых столбец города называется "Newcastle".В этой части я сомневаюсь в том, как повторно использовать код почтового запроса AJAX при нажатии на город внутри модального окна.Знаете ли вы, как этого добиться?

Когда пользователь нажимает на «Ньюкасл», он перенаправляется на «http://proj.test/conferences/where/city/Newcastle", и появляется конференция, где городом является Ньюкасл (в данном случаеесть только 1):

[{"id":2,"name":"conf test","city":"Newcastle",...}]

Но то, что должно произойти, - это конференции, где столбец города Ньюкасл появляется в разделе #conferences.

AutoCompleteController:

class AutocompleteController extends Controller
{
    public function index(){
    return view('autocomplete.index');
    }

    public function search(Request $request){
        $search = $request->term;
        $conferences = Conference::where('name', 'LIKE', '%'.$search.'%')->get();

        $cities = Conference::where('city', 'LIKE', '%'.$search.'%')->get();

        $data= [];
        foreach ($conferences as $key => $value){
            $data[] = ['category'=> 'Conferences', 'value' => $value->name, 'url' => 'conference/'.$value->id.'/'.$value->slug];
        }

        foreach ($cities as $key => $value){
            $data[] = ['category'=> 'Cities', 'value' => $value->city, 'url' => 'conferences/where/city/'.$value->city];
        }
        return response($data);
    }
}

Автозаполнение Jquery:

$.widget( "custom.catcomplete", $.ui.autocomplete, {
_create: function() {
    this._super();
    this.widget().menu( "option", "items", "> :not(.ui-autocomplete-category)" );
    },
    _renderMenu: function( ul, items ) {
    var that = this,
    currentCategory = "";
    $.each( items, function( index, item ) {
        var li;
        if ( item.category != currentCategory ) {
            ul.append( "<li class='ui-autocomplete-category bg bg-light-gray2 h6 font-weight-bold text-heading-blue'>"
            + item.category + "</li>" );
            currentCategory = item.category;
        }
        li = that._renderItemData( ul, item );
        if ( item.category ) {
        li.attr( "aria-label", item.category + " : " + item.label );
        }
    });
    }
});

$("#search").catcomplete({
    source: "{{ URL::to('autocomplete-search') }}",
    select: function(event, ui) {
    window.location.href = ui.item.url;
}

Модальный режим, который появляется при нажатии Show citis:

<div class="modal fade bd-example-modal-lg" id="modal2" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-body">
                <ul class="modal-list row">
                    @foreach($cities as $city)
                    <li class="col-lg-4 col-md-6 col-sm-12">
                        <a  class="" name="city" id="{{$city}}">{{$city}}</a>
                    </li>
                    @endforeach
                </ul>
            </div>
        </div>
    </div>
</div>

div #conferences ", которые показывают конференции, результаты:

<div class="row" id="conferences">
    @foreach(conferences as $conference)
    <div class="col-12 col-sm-6 col-lg-4 col-xl-3 mb-4">
        <img class="card-img-top" src="{{$conference->image}}" alt="Card image cap">
        <div class="card-body">
            <h5 class="card-title h6 font-weight-bold text-heading-blue">{{$conference->name}}</h5>
            <p class="card-text font-size-sm"><i class="fa fa-map-marker" aria-hidden="true"></i> {{$conference->place}},
                {{$conference->city}}</p>
        </div>
    </div>
    @endforeach
</div>

jQuery AJAX-запрос:

$("a[name='city']").on('click', function(){

    $('#showCities').html($(this).text()+' <i class="fa fa-caret-down" aria-hidden="true"></i>');

        var city = $(this).attr("id");

        $.ajax({

        url: '{{ route('city.conferences',null) }}/' + city,
        type: 'GET',
        success:function(result){
        console.log(result)

        $('#conferences').empty();
        var newConferences='';
        var placeholder = "{{route('conferences.show', ['id' => '1', 'slug' => 'demo-slug'])}}";
        $.each(result, function(index, conference) {
        $('#modal2').modal('hide');
        var url = placeholder.replace(1, conference.id).replace('demo-slug', conference.slug);

        newConferences += '<div class="col-12 col-sm-6 col-lg-4 col-xl-3 mb-4">\n' +
            '    <div class="card-body">\n' +
                '      <h5 class="card-title h6 font-weight-bold text-heading-blue">'+conference.name+'</h5>\n' +
                '      <p class="card-text font-size-sm"><i class="fa fa-map-marker" aria-hidden="true"></i> '+conference.city+'</p>\n' +
                '     </div>\n' +
            '   </div>\n';
        });
        $('#conferences').html(newConferences);

        },
        error: function(error) {

        console.log(error.status)
        }
    });
});

1 Ответ

0 голосов
/ 21 мая 2018

Одним из вариантов будет использование атрибутов данных.В качестве дополнительной критики, в зависимости от того, как работает ваш AJAX-запрос, вы можете не использовать название города в качестве идентификатора;особенно если в запросе могут быть возвращены несколько городов с одинаковыми именами (идентификаторы будут конфликтовать и давать неожиданные результаты).

<div class="modal fade bd-example-modal-lg" id="modal2" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-body">
                <ul class="modal-list row" id="cities-list>
                    @foreach($cities as $city)
                    <li class="col-lg-4 col-md-6 col-sm-12">
                        <a class="" data-city-name="{{city}}" name="city" id="{{$city}}">{{$city}}</a>
                    </li>
                    @endforeach
                </ul>
            </div>
        </div>
    </div>
</div>

Например, я добавил некоторые идентификаторы в ваш код выше.Тогда вы просто получите доступ к этим значениям в событии клика по вашей ссылке следующим образом:

$('#cities-list li a').on('click', function() {
    // push city name to #conferences div
    $('#conferences').append($('<p />').text($(this).attr('data-city-name')));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...