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

Commit 2329e9d

Browse files
fix(ngOptions): fix model<->option interaction when using track by
Closes #10869
1 parent cd923c2 commit 2329e9d

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

test/ng/directive/ngOptionsSpec.js

+21-8
Original file line numberDiff line numberDiff line change
@@ -657,48 +657,61 @@ describe('ngOptions', function() {
657657
});
658658

659659

660-
it('should update the selected item when only the properties on the object change (single)', function() {
660+
it('should update the selected option even if only the tracked property on the selected object changes (single)', function() {
661661
createSelect({
662662
'ng-model': 'selected',
663663
'ng-options': 'item.label for item in arr track by item.id'
664664
});
665665

666666
scope.$apply(function() {
667-
scope.selected = {id: 10, label: 'new ten'};
667+
scope.selected = {id: 10, label: 'ten'};
668668
});
669669

670-
expect(element.val()).toBe('10');
670+
expect(element.val()).toEqual('10');
671671

672-
// Update the properties on the
672+
// Update the properties on the selected object, rather than replacing the whole object
673673
scope.$apply(function() {
674674
scope.selected.id = 20;
675675
scope.selected.label = 'new twenty';
676676
});
677677

678-
expect(element.val()).toBe('20');
678+
// The value of the select should change since the id property changed
679+
expect(element.val()).toEqual('20');
680+
681+
// But the label of the selected option does not change
682+
var option = element.find('option').eq(1);
683+
expect(option.prop('selected')).toEqual(true);
684+
expect(option.text()).toEqual('twenty'); // not 'new twenty'
679685
});
680686

681687

682-
it('should update the selected item when only the properties on the object change (multi)', function() {
688+
it('should update the selected options even if only the tracked properties on the objects in the ' +
689+
'selected collection change (multi)', function() {
683690
createSelect({
684691
'ng-model': 'selected',
685692
'multiple': true,
686693
'ng-options': 'item.label for item in arr track by item.id'
687694
});
688695

689696
scope.$apply(function() {
690-
scope.selected = [{id: 10, label: 'new ten'}];
697+
scope.selected = [{id: 10, label: 'ten'}];
691698
});
692699

693700
expect(element.val()).toEqual(['10']);
694701

695-
// Update the properties on the
702+
// Update the properties on the object in the selected array, rather than replacing the whole object
696703
scope.$apply(function() {
697704
scope.selected[0].id = 20;
698705
scope.selected[0].label = 'new twenty';
699706
});
700707

708+
// The value of the select should change since the id property changed
701709
expect(element.val()).toEqual(['20']);
710+
711+
// But the label of the selected option does not change
712+
var option = element.find('option').eq(1);
713+
expect(option.prop('selected')).toEqual(true);
714+
expect(option.text()).toEqual('twenty'); // not 'new twenty'
702715
});
703716

704717

0 commit comments

Comments
 (0)