Динамический выпадающий список не работает из-за большого запроса

У меня проблема с раскрывающимся полем, которое динамически заполняется большим запросом. Поскольку запрос возвращает очень большое значение, когда пользователи обращаются к форме, форма зависает. Это похоже на ожидание заполнения раскрывающегося списка. Тем временем все форматирование формы искажается, раскрывающийся список исчезает. Когда я ограничиваю свой запрос меньшим количеством записей, все работает нормально. Этот запрос возвращает более 26 тыс. записей. Есть ли способ решить эту проблему в ColdFusion? Я не верю, что ColdFusion не может справиться с такой ситуацией. Я использую ColdFusion2016 и серверную часть Oracle 11g.

Вот запрос и раскрывающийся список:

    <cfquery name="xCodes" datasource="#application.DSN#">
     select xcode, desc, xcode || ' ---- ' || desc as FullDesc
     from x_header
     <cfif IsDefined("url.codes")>
        <cfif url.codes EQ "y">
         order by xcode
        <cfelse>
         order by desc
        </cfif>
     </cfif>
    </cfquery>

        <select name="xcode" id="xcode" class="RegSelect" required="TRUE">
          <option value="">--- Select a code ---</option>
             <cfoutput query="xCodes">
             <option value="#xcode#">#FullDesc#</option>
             </cfoutput>
        </select>

person user3779216    schedule 19.01.2018    source источник
comment
Возможно ли, что запрос возвращает значения, которые являются проблемой для сгенерированного HTML, например, незакодированные значения больше/меньше или амперсанд? (26 тыс. элементов кажется довольно большим, чтобы их нужно было прокручивать...)   -  person Alex Poole    schedule 19.01.2018
comment
Не похоже, что есть проблема со значением, потому что, если я подожду достаточно долго, наконец появится раскрывающийся список, но пользователям слишком долго ждать, особенно с формой деформации на их интерфейсе. Здесь много элементов для прокрутки, но это для использования администратором. В моем офисе более шести администраторов, которым нужен доступ к этим значениям.   -  person user3779216    schedule 19.01.2018
comment
Согласитесь, 26 тысяч элементов намного слишком много для прокрутки (и действительно ли это необходимо или их можно отфильтровать?). Думаю, в Oracle можно использовать ROWNUM (oracle.com/technetwork/issue-archive/2006/06-sep/), чтобы разбить ваш запрос на страницы, чтобы вернуть то, что вы хотите, а затем циклически повторять нужные вам результаты. AJAX, вероятно, ваш лучший выбор.   -  person Shawn    schedule 22.01.2018
comment
Вы также можете использовать Select2. stackoverflow.com/ вопросы/32533757/   -  person Shawn    schedule 22.01.2018


Ответы (1)


Я согласен с Алексом Пулом в том, что 26 000 элементов в выборке — это довольно много, и мне кажется, что механизм рендеринга вашего браузера изо всех сил пытается его построить, поэтому ваше форматирование шаткое, пока оно не будет окончательно построено.

Вот несколько предложений.

  1. Можно ли разбить значения на логические группы и использовать множественный выбор? Таким образом, вашим первым выбором будут значения логической группы. Как только пользователь сделает свой выбор, следующий выбор будет содержать только значения в этой логической группе. Если такой логической группировки не существует, вы можете составить свою собственную. Например, вы можете использовать 26 букв алфавита в качестве логической группы, тогда ваш подвыбор будет содержать в среднем 1000 вариантов.

  2. Другим предложением было бы использовать автозаполнение jQuery и заполнять ваши значения с помощью вызова ajax. Я делал это несколько раз, используя ColdFusion и Oracle, и все отлично работает.

person Guest    schedule 19.01.2018
comment
Это правильный ответ. Это не проблема ColdFusion. 26 тысяч опций в раскрывающемся списке непригодны и нелепы. Как было предложено, лучшим подходом было бы использование раскрывающегося списка поиска AJAX. - person luxdvie; 19.01.2018
comment
Благодарю вас! Я думал об использовании логической группы, но я не был уверен - person user3779216; 19.01.2018
comment
@ user3779216 нет проблем. Пожалуйста, отметьте как принятый ответ, если вы используете это решение. - person Guest; 19.01.2018