From 8391fbf7f06d929b5abe00b14e6972ac490451af Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Thu, 28 Aug 2014 20:42:07 -0700 Subject: [PATCH 1/2] perf(select): Execute render after $digest cycle This is an optimization to defer execution of the render function in the select directive after the $digest cycle completes inside the $watchCollection expressions. This does a check to see if the render function is already registered in the $$postDigestQueue before it passes it into $$postDigest, guaranteeing that the DOM manipulation happens only in one execution after the model settles. --- src/ng/directive/select.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index f8f2f0b81297..efffe9e2d858 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -413,9 +413,17 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { ctrl.$render = render; - scope.$watchCollection(valuesFn, render); + scope.$watchCollection(valuesFn, function () { + if (scope.$$postDigestQueue.indexOf(render) === -1) { + scope.$$postDigest(render); + } + }); if ( multiple ) { - scope.$watchCollection(function() { return ctrl.$modelValue; }, render); + scope.$watchCollection(function() { return ctrl.$modelValue; }, function () { + if (scope.$$postDigestQueue.indexOf(render) === -1) { + scope.$$postDigest(render); + } + }); } function getSelectedSet() { From 4c3d9bfa7d34e0dc8acc3acf6b19eb65744f1794 Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Thu, 28 Aug 2014 21:34:00 -0700 Subject: [PATCH 2/2] Change indexOf to manual toggle Add reset of toggle --- src/ng/directive/select.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js index efffe9e2d858..fc542e53fc90 100644 --- a/src/ng/directive/select.js +++ b/src/ng/directive/select.js @@ -224,6 +224,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) { optionsExp = attr.ngOptions, nullOption = false, // if false, user will not be able to select it (used by ngOptions) emptyOption, + renderScheduled = false, // we can't just jqLite('