2013-02-08 8 views
0

Я создаю простое приложение, которое получает список элементов из db (около 3000 строк), отображает таблицу с именами элементов, а затем отображает спецификации элементов всякий раз, когда мы кликаем по определенному элементу. Я заметил небольшую проблему с производительностью при рендеринге таблицы html с g: remoteLink вместо старого базового тега.Grails remoteLink vs <a>

У меня есть контроллер, который получает данные и визуализирует шаблон

def items = sql.rows("select * from items") 
render (template:'itemList',model:[result:items]) 

я также простой индексный файл

<body> 
<g:remoteLink controller="items" action="getItems" update="itemList">Items</g:remoteLink> 
    <div class="body" style="width: 1000px;"> 
     <div id="itemList"></div> 
    </div> 
</body> 

и мой шаблон ITEMLIST (медленный, вокруг 4s)

<table width="100%" cellspacing="0" cellpadding="0" border="1" id="mytable"> 
    <g:each var="item" in="${result}"> 
    <tr> 
    <td><g:remoteLink controller="items" action="getItemSpec" update="itemDetail" params="${ [itemcode: item.itemcode] }"> 
     ${item.itemcode}</g:remoteLink></td></tr> 
    </g:each> 
</table> 

другая версия шаблона itemList (быстрая, около 400 мс, с использованием сгенерированной ссылки с удаленногоLink)

<table width="100%" cellspacing="0" cellpadding="0" border="1" id="mytable"> 
    <g:each var="item" in="${result}"> 
    <tr> 
    <td> 
<a onclick="jQuery.ajax({type:'POST',data:{'itemcode': '${item.itemcode}'}, url:'/myApp/items/getItemSpec',success:function(data,textStatus){jQuery('#itemDetail').html(data);},error:function(XMLHttpRequest,textStatus,errorThrown){}});return false;" href="/myApp/items/getItemSpec?itemcode=${item.itemcode} "> ${item.itemcode}</a> 
</td> 
</tr> 
    </g:each> 
</table> 

Есть ли способ сделать рендеринг быстрее с помощью remoteLink вместо использования тега?

Спасибо!

+1

Вы видите ту же проблему с производительностью, если вы работаете с «grails run-war»? Снижение производительности может быть просто побочным эффектом перезагрузки GSP при использовании 'run-app'. –

+1

Что сказал Андрей и тот факт, что рендеринг 3000 строк без данных подкачки, как правило, не является отличной идеей. Тег должен обрабатываться, и это очень много обработки сразу. – Gregg

+0

Существует небольшая разница между run-app и run-war, но тег все еще быстрее. Я знаю, что отображение 3000 строк не является идеей geat. Следующий шаг - реализовать что-то вроде jqgrid/datatables, потому что мне понадобится сортировка/фильтрация. Я сравниваю рендеринг с/без вызовов ajax, чтобы увидеть, какой из них лучше всего работает. – Mo7

ответ

1

Несколько вещей, которые я хотел бы предложить, учитывая ...

1.) Loading 3000 ничего в свете, как правило, не является хорошей идеей. Подумайте о том, что вы действительно пытаетесь достичь, показывая этот объем данных.

2.) Если в конечном итоге вы планируете использовать что-то вроде jqgrid или datatables, не сосредотачивайтесь на чем-то, что один из этих инструментов может по существу сделать по-другому. Идите прямо к окончательному решению, которое вам нужно, а затем откорректируйте.

3.) Подумайте обо всем, что генерируется код на странице и сколько фактического используется. Если вы создаете 3000 ссылок, и пользователь, скорее всего, будет только нажимать на 5 или 10, возможно, вы используете какой-то jQuery для обработки динамической загрузки ссылки при щелчке по строке. Это должно ускорить рендеринг, потому что для отображения браузера меньше HTML.

4.) Наконец, рамки, такие как Grails, среди нескольких других позволяют вам легко делать то, что может прийти к жертве некоторой производительности. Получение максимальной отдачи от чего-то может потребовать от вас большого удобства.

Наслаждайтесь! Надеюсь это поможет.

+0

Я согласен со всеми вышеперечисленными пунктами, кроме первого, потому что он подходит для проекта, над которым я работаю. Третий из них дал мне подсказку, поэтому я создал функцию js, которая обертывает js, содержащуюся в событии onclick, это было довольно много, я искал, но это обход, как вы сказали в пункте 4. @michael -j-подветренной – Mo7

Смежные вопросы