Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit cdc7db3

Browse files
fix(select): do not update selected property of an option element on digest with no change event
The `render()` method was being invoked on every turn of the digest cycle, which was inadvertently updating the DOM even when a `change` event had not been triggered. This change only calls the `render()` method when `ctrl.$render()` is called, as part of the NgModelController` lifecycle and when the `modelValue` has significantly changed. Closes #8221 Closes #7715
1 parent 7fdd26e commit cdc7db3

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

src/ng/directive/select.js

+25-14
Original file line numberDiff line numberDiff line change
@@ -407,13 +407,35 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
407407
}
408408
}
409409
ctrl.$setViewValue(value);
410+
render();
410411
});
411412
});
412413

413414
ctrl.$render = render;
414415

415-
// TODO(vojta): can't we optimize this ?
416-
scope.$watch(render);
416+
scope.$watchCollection(valuesFn, render);
417+
if ( multiple ) {
418+
scope.$watchCollection(getSelectedSet, render);
419+
}
420+
421+
function getSelectedSet() {
422+
var selectedSet = false;
423+
if (multiple) {
424+
var modelValue = ctrl.$modelValue;
425+
if (trackFn && isArray(modelValue)) {
426+
selectedSet = new HashMap([]);
427+
var locals = {};
428+
for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
429+
locals[valueName] = modelValue[trackIndex];
430+
selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
431+
}
432+
} else {
433+
selectedSet = new HashMap(modelValue);
434+
}
435+
}
436+
return selectedSet;
437+
}
438+
417439

418440
function render() {
419441
// Temporary location for the option groups before we render them
@@ -431,22 +453,11 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
431453
groupIndex, index,
432454
locals = {},
433455
selected,
434-
selectedSet = false, // nothing is selected yet
456+
selectedSet = getSelectedSet(),
435457
lastElement,
436458
element,
437459
label;
438460

439-
if (multiple) {
440-
if (trackFn && isArray(modelValue)) {
441-
selectedSet = new HashMap([]);
442-
for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
443-
locals[valueName] = modelValue[trackIndex];
444-
selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
445-
}
446-
} else {
447-
selectedSet = new HashMap(modelValue);
448-
}
449-
}
450461

451462
// We now build up the list of options we need (we merge later)
452463
for (index = 0; length = keys.length, index < length; index++) {

0 commit comments

Comments
 (0)