Skip to content
This repository was archived by the owner on Oct 2, 2019. It is now read-only.

Commit 1dc1133

Browse files
committed
Check formatter/parser (single property binding) to work correctly on "multiple" mode
1 parent 5b6ac8f commit 1dc1133

File tree

1 file changed

+54
-19
lines changed

1 file changed

+54
-19
lines changed

src/select.js

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -518,22 +518,53 @@
518518

519519
//From view --> model
520520
ngModel.$parsers.unshift(function (inputValue) {
521-
var locals = {};
522-
locals[$select.parserResult.itemName] = inputValue;
523-
var result = $select.parserResult.modelMapper(scope, locals);
524-
return result;
521+
var locals = {},
522+
result;
523+
if ($select.multiple){
524+
var resultMultiple = [];
525+
for (var j = inputValue.length - 1; j >= 0; j--) {
526+
locals = {};
527+
locals[$select.parserResult.itemName] = inputValue[j];
528+
result = $select.parserResult.modelMapper(scope, locals);
529+
resultMultiple.unshift(result);
530+
}
531+
return resultMultiple;
532+
}else{
533+
locals = {};
534+
locals[$select.parserResult.itemName] = inputValue;
535+
result = $select.parserResult.modelMapper(scope, locals);
536+
return result;
537+
}
525538
});
526539

527540
//From model --> view
528541
ngModel.$formatters.unshift(function (inputValue) {
529-
var data = $select.parserResult.source(scope);
542+
var data = $select.parserResult.source(scope),
543+
locals = {},
544+
result;
530545
if (data){
531-
for (var i = data.length - 1; i >= 0; i--) {
532-
var locals = {};
533-
locals[$select.parserResult.itemName] = data[i];
534-
var result = $select.parserResult.modelMapper(scope, locals);
535-
if (result == inputValue){
536-
return data[i];
546+
if ($select.multiple){
547+
var resultMultiple = [];
548+
for (var k = data.length - 1; k >= 0; k--) {
549+
locals = {};
550+
locals[$select.parserResult.itemName] = data[k];
551+
result = $select.parserResult.modelMapper(scope, locals);
552+
for (var j = inputValue.length - 1; j >= 0; j--) {
553+
if (result == inputValue[j]){
554+
resultMultiple.push(data[k]);
555+
break;
556+
}
557+
}
558+
}
559+
return resultMultiple;
560+
}else{
561+
for (var i = data.length - 1; i >= 0; i--) {
562+
locals = {};
563+
locals[$select.parserResult.itemName] = data[i];
564+
result = $select.parserResult.modelMapper(scope, locals);
565+
if (result == inputValue){
566+
return data[i];
567+
}
537568
}
538569
}
539570
}
@@ -659,14 +690,18 @@
659690
$select.resetSearchInput = resetSearchInput !== undefined ? resetSearchInput : true;
660691
});
661692

662-
scope.$watch('$select.selected', function(newValue) {
663-
if (ngModel.$viewValue !== newValue) {
664-
ngModel.$setViewValue(newValue);
665-
}
666-
if($select.multiple) $select.sizeSearchInput();
667-
},$select.multiple); //Do depth watch if multiple
668-
669-
if ($select.multiple) focusser.prop('disabled', true); //Focusser isn't needed if multiple
693+
if ($select.multiple){
694+
scope.$watchCollection('$select.selected', function(newValue) {
695+
ngModel.$setViewValue(newValue, null, true); //Third parameter (revalidate) is true, to force $parsers to recreate model
696+
});
697+
focusser.prop('disabled', true); //Focusser isn't needed if multiple
698+
}else{
699+
scope.$watch('$select.selected', function(newValue) {
700+
if (ngModel.$viewValue !== newValue) {
701+
ngModel.$setViewValue(newValue);
702+
}
703+
});
704+
}
670705

671706
ngModel.$render = function() {
672707
if($select.multiple){

0 commit comments

Comments
 (0)