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

Commit c286094

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 e9a00fb commit c286094

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
@@ -397,13 +397,35 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
397397
}
398398
}
399399
ctrl.$setViewValue(value);
400+
render();
400401
});
401402
});
402403

403404
ctrl.$render = render;
404405

405-
// TODO(vojta): can't we optimize this ?
406-
scope.$watch(render);
406+
scope.$watchCollection(valuesFn, render);
407+
if ( multiple ) {
408+
scope.$watchCollection(getSelectedSet, render);
409+
}
410+
411+
function getSelectedSet() {
412+
var selectedSet = false;
413+
if (multiple) {
414+
var modelValue = ctrl.$modelValue;
415+
if (trackFn && isArray(modelValue)) {
416+
selectedSet = new HashMap([]);
417+
var locals = {};
418+
for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
419+
locals[valueName] = modelValue[trackIndex];
420+
selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
421+
}
422+
} else {
423+
selectedSet = new HashMap(modelValue);
424+
}
425+
}
426+
return selectedSet;
427+
}
428+
407429

408430
function render() {
409431
// Temporary location for the option groups before we render them
@@ -421,22 +443,11 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
421443
groupIndex, index,
422444
locals = {},
423445
selected,
424-
selectedSet = false, // nothing is selected yet
446+
selectedSet = getSelectedSet(),
425447
lastElement,
426448
element,
427449
label;
428450

429-
if (multiple) {
430-
if (trackFn && isArray(modelValue)) {
431-
selectedSet = new HashMap([]);
432-
for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
433-
locals[valueName] = modelValue[trackIndex];
434-
selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
435-
}
436-
} else {
437-
selectedSet = new HashMap(modelValue);
438-
}
439-
}
440451

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

0 commit comments

Comments
 (0)