Here's the fiddle: http://jsfiddle.net/D5h7H/7/
It renders the following:
<div ng-repeat="group in Model.Groups">
<span>{{group.Name}}</span>
<div ng-repeat="filter in group.Filters">
<input type="checkbox" ng-model="filter.enabled">{{filter.Name}}
<select ng-disabled="!filter.enabled">
<option ng-repeat="value in filter.Values">{{value}}</option>
</select>
</div>
</div>
It's a list of filters that is loaded in json from the server and then rendered to the user (in an example json is generated right there in Fiddle). At the moment there are 6 groups of 30 filters in each with 15 option elements for each filter.
In Firefox it now takes about 2 seconds to redraw the UI.
Is this time ok for angular js? Is there anything I'm doing wrong that caused 2sec. rendering (cause 2000 elements doesn't look as a big number to me, but 2sec. is certainly big)?
Substitute
ng-repeat="group in Model.Groups"
withcollection-repeat="group in Model.Groups"
.I realize this is an old question but I don't think an answer has been posted yet.
I believe the reason your form is slow is not just that you have 2,000+ elements but that those elements are form elements using
ng-model
. The built in form validation in Angular is very powerful and convenient but can behave very slowly especially when you first load the form. If those 180(6x30) input elements used something likeng-checked
instead ofng-model
, avoiding form validation mechanism, then you form should load much faster.<input type="checkbox" ng-checked="filter.enabled">{{filter.Name}}
Reducing watchers with one-time binding via
::
will also help the situation but I think your main issue is withng-model
and angular form validation.That's due to how AngularJS does dirty checking. Here's a definitive answer to slow rendering with AngularJS.
In AngularJS 1.3+, there is
One-time binding
built-in:In order to make the one-time binding, prepend
::
to the binding value:Also see relevant discussions:
Using this project: angular-vs-repeat will boost up your performance.
With this, the browser will render (thus angular will do its dirty-checking) to only so many elements that fit in the scrollable container where you render the elements. Demo here
With about 2000 items to load, you needn't to render them all at once. You can aggressivly render them when page scroll, or change page. Refer to this question
Use unique id such as filter id to minimize the time of ng-repeat's creation of all the dom. Refer to tracking-and-duplicates
As the answer of alecxe above, use one-time bounding, if that not proper for you, you can slow the digest frequency with such
ng-model-options="{ debounce: 200 }
angular option settingsAnd last, you have to use some performance analyser tools to track the bottleneck of the application, and fix them.
Hope this helps.