2013-12-17 4 views
1

Имейте указание angular.js, которое отображается в виде таблицы. В большинстве случаев таблица небольшая, поэтому производительность не является проблемой.Избегайте ненужной оценки связанных значений в Angular.js

Но иногда таблица имеет много строк (например, тысяч), поэтому рендеринг каждой строки дорог, так как каждое значение привязки оценивается дважды, и существует множество связанных значений. И Angular, кажется, очень много оценивает эту таблицу, только чтобы найти, что все значения в ней не изменяются и, следовательно, не нужно переизлучать, парализуя приложение без необходимости.

Например, вся таблица представляется переоцененной, когда значение $scope.showMenu изменяется на mouseenter/mouseleave.

Есть ли способ рассказать Угловой, что вся таблица зависит от какого-либо другого значения, скажем, $scope.checksum, так что если это не изменится, то вся таблица не изменится?

<div class="header" ng-mouseenter="showMenu=true" ng-mouseleave="showMenu=false"> 
    <!-- show dropdown menu only when hovering over the header -->  
    <span ng-if="showMenu" class="menu dropdown" > ... menu content goes here...</span> 

    <h2>{{getTitle()}}</h2> 
    <p>{{description}}</p> 
</div> 

<table> 
    <tr ng-repeat="key in rowKeys"> 
     <td title="{{getRowItem(key)|pretty">{{getRowItem(key)|abbreviated}}</td> 
     <td>{{getRowValue(key)|number</td> 
    </tr> 
enter code here 
    </tr> 
</table> 
+1

Сверху моей головы, если вы попробуете обернуть каждую секцию в своем собственном контроллере, чтобы каждый раздел имел различную $ scope, помогает ли что-нибудь? Создание таблицы собственной директивой также создало бы новую область $. – Hylianpuffball

+0

Это, безусловно, будет более чистый код, отделяющий пользовательский интерфейс от данных. Попробуй это сейчас. Я вижу из списка «Связанных» сообщений пару для рендеринга больших списков, поэтому также будет ограничено количество строк, которые отображаются с помощью 'limitTo'. Все равно было бы неплохо отметить зависимости, чтобы грязная проверка не оценивала каждое связанное значение. – prototype

+1

Прежде чем погрузиться в него, я бы предложил рассмотреть другие улучшения производительности для больших угловых списков JS. Http://tech.small-improvements.com/2013/09/10/angularjs-performance-with-large-lists/ – roo2

ответ

0

Если вы используете Угловой 1.3 и данные в таблице не обновляются в другом момент вы должны попробовать связать один раз.

<tr ng-repeat="key in ::rowKeys"> 
     <td>{{::key}}</td> 
    </tr> 

Также нг-MouseEnter и нг-MouseLeave генерировать больше $ наблюдателей, я рекомендую вам использовать правила CSS, чтобы сделать этот эффект в меню.

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