Несколько экземпляров автозаполнения JQueryUI на одной странице пирамиды - PullRequest
0 голосов
/ 03 октября 2011

У меня есть работающий виджет ввода автозаполнения JQueryUI, который прекрасно работает с моим бэкэндом Pyramid. Автозаполнение отправляет свой request.params['term'] по тому же URL-адресу, что и страница, на которой он находится, а Pyramid использует request_param='term' в качестве предиката маршрута для отправки значения термина в мой запрос на просмотр базы данных.

Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужно добавить больше виджетов автозаполнения на ту же страницу. Однако я не могу использовать один и тот же предикат маршрута term, потому что оба виджета публикуют term, и поэтому Pyramid не знает, куда отправить сообщение.

Я знаю, что вы можете создавать собственные предикаты в Pyramid, но, насколько я вижу, в 2 виджетах автозаполнения, с помощью которых я могу создавать собственные предикаты, нет ничего уникального.

Чтобы дать некоторый контекст, ниже приведено определение маршрута / вида. Это определение на самом деле является незаконным, потому что пирамида справедливо отказалась от идентичных предикатов, но оно служит для демонстрации моей дилеммы:

config.add_route('search_programs','/search/programs')
config.add_view(
        'haystack.search.search_programs',
        route_name='search_programs',
        renderer='templates/search_programs.jinja2')
config.add_view(
        'haystack.search.programtype_autocomplete',
        route_name='search_programs',
        request_param='term', renderer='json')
config.add_view(
        'haystack.search.majorgenre_autocomplete',
        route_name='search_programs',
        request_param='term', renderer='json')

Что было бы замечательно, если бы у виджета автозаполнения была возможность указать произвольный ключ для публикации вместо просто «термина» каждый раз. Любая помощь будет потрясающей.

1 Ответ

3 голосов
/ 03 октября 2011

Вам необходимо явно указать autocomplete для каждого виджета и указать конкретный URL и / или пользовательский фрагмент данных в сообщении.

Это клип из примера Удаленный источник данных JSONP в документации JQueryUI:

$( "#a-particular-auto-complete-widget" ).autocomplete({
    source: function( request, response ) {
        $.ajax({ 
                 /* specifiy your specific url here - could be a different 
                  * route for each different source....
                  */
                 url: "http://someurl.com/search/programs/majorgenre",
                 dataType: "jsonp",
                 data: { featureClass: "P",
                         style: "full",
                         maxRows: 12,
                         /* ...or add a custom piece of data to 
                          * indicate how it should be handled by 
                          * your Pyramid view(s).
                          */
                         customParam: "majorgenre",
                         name_startsWith: request.term
                       }
 /* see docs for rest of code... */
 .... 

Тогда вы можете справиться с этим в Пирамиде так, как хотите. Я, вероятно, просто сопоставил бы один вид с этим маршрутом (и не беспокоился о Ajax customParam):

config.add_route('search_programs','/search/programs/{autocomplete}')

А потом в представлении:

def autocomplete_handler_view(request):
    autocomplete_type = request.matchdict.get('autocomplete', None)
    if autocomplete == 'majorgenre':
        return handle_majorgenre(request.params['term'])

    elif autocomplete == 'programtype':
        return handle_programtype(request.params['term'])
...