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

Commit f3c1d04

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

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
@@ -520,22 +520,53 @@
520520

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

529542
//From model --> view
530543
ngModel.$formatters.unshift(function (inputValue) {
531-
var data = $select.parserResult.source(scope);
544+
var data = $select.parserResult.source(scope),
545+
locals = {},
546+
result;
532547
if (data){
533-
for (var i = data.length - 1; i >= 0; i--) {
534-
var locals = {};
535-
locals[$select.parserResult.itemName] = data[i];
536-
var result = $select.parserResult.modelMapper(scope, locals);
537-
if (result == inputValue){
538-
return data[i];
548+
if ($select.multiple){
549+
var resultMultiple = [];
550+
for (var k = data.length - 1; k >= 0; k--) {
551+
locals = {};
552+
locals[$select.parserResult.itemName] = data[k];
553+
result = $select.parserResult.modelMapper(scope, locals);
554+
for (var j = inputValue.length - 1; j >= 0; j--) {
555+
if (result == inputValue[j]){
556+
resultMultiple.push(data[k]);
557+
break;
558+
}
559+
}
560+
}
561+
return resultMultiple;
562+
}else{
563+
for (var i = data.length - 1; i >= 0; i--) {
564+
locals = {};
565+
locals[$select.parserResult.itemName] = data[i];
566+
result = $select.parserResult.modelMapper(scope, locals);
567+
if (result == inputValue){
568+
return data[i];
569+
}
539570
}
540571
}
541572
}
@@ -666,14 +697,18 @@
666697
$select.resetSearchInput = resetSearchInput !== undefined ? resetSearchInput : true;
667698
});
668699

669-
scope.$watch('$select.selected', function(newValue) {
670-
if (ngModel.$viewValue !== newValue) {
671-
ngModel.$setViewValue(newValue);
672-
}
673-
if($select.multiple) $select.sizeSearchInput();
674-
},$select.multiple); //Do depth watch if multiple
675-
676-
if ($select.multiple) focusser.prop('disabled', true); //Focusser isn't needed if multiple
700+
if ($select.multiple){
701+
scope.$watchCollection('$select.selected', function(newValue) {
702+
ngModel.$setViewValue(newValue, null, true); //Third parameter (revalidate) is true, to force $parsers to recreate model
703+
});
704+
focusser.prop('disabled', true); //Focusser isn't needed if multiple
705+
}else{
706+
scope.$watch('$select.selected', function(newValue) {
707+
if (ngModel.$viewValue !== newValue) {
708+
ngModel.$setViewValue(newValue);
709+
}
710+
});
711+
}
677712

678713
ngModel.$render = function() {
679714
if($select.multiple){

0 commit comments

Comments
 (0)