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

Commit 177b690

Browse files
committed
WIP: implement getViewValue method to normalize calculation of values
1 parent 0073aac commit 177b690

File tree

1 file changed

+60
-57
lines changed

1 file changed

+60
-57
lines changed

src/ng/directive/select.js

+60-57
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,64 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
383383
// clear contents, we'll add what's needed based on the model
384384
selectElement.empty();
385385

386+
function getViewValue (el, scope, locals, collection, multiple) {
387+
var key = el.val();
388+
var value;
389+
var calculateViewValue;
390+
391+
if (selectAsFn) {
392+
calculateViewValue = function () {
393+
var collectionWithValueName = {};
394+
collectionWithValueName[valueName] = collection[key];
395+
collectionWithValueName[keyName] = key;
396+
397+
for (var i in collection) {
398+
if (collection.hasOwnProperty(i)) {
399+
locals[valueName] = collection[i];
400+
if (keyName) locals[keyName] = i;
401+
if (selectAsFn(scope, locals) ==
402+
selectAsFn(scope, collectionWithValueName)) {
403+
return selectAsFn(scope, locals);
404+
}
405+
}
406+
}
407+
};
408+
} else if (trackFn) {
409+
calculateViewValue = function() {
410+
for (var trackIndex = 0; trackIndex < collection.length; trackIndex++) {
411+
locals[valueName] = collection[trackIndex];
412+
if (trackFn(scope, locals) == key) {
413+
return valueFn(scope, locals);
414+
}
415+
}
416+
};
417+
}
418+
else {
419+
calculateViewValue = function() {
420+
locals[valueName] = collection[key];
421+
if (keyName) locals[keyName] = key;
422+
return valueFn(scope, locals);
423+
};
424+
}
425+
426+
if (multiple) {
427+
if (keyName) locals[keyName] = key;
428+
calculateViewValue();
429+
430+
return (selectAsFn || valueFn)(scope, locals);
431+
}
432+
433+
if (key == '?') {
434+
value = undefined;
435+
} else if (key === ''){
436+
value = null;
437+
} else {
438+
value = calculateViewValue();
439+
}
440+
441+
return value;
442+
}
443+
386444
selectElement.on('change', function() {
387445
scope.$apply(function() {
388446
var optionGroup,
@@ -400,67 +458,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
400458

401459
for(index = 1, length = optionGroup.length; index < length; index++) {
402460
if ((optionElement = optionGroup[index].element)[0].selected) {
403-
key = optionElement.val();
404-
if (keyName) locals[keyName] = key;
405-
if (selectAsFn) {
406-
var collectionWithValueName = {};
407-
collectionWithValueName[valueName] = collection[key];
408-
collectionWithValueName[keyName] = key;
409-
410-
for (i in collection) {
411-
if (collection.hasOwnProperty(i)) {
412-
locals[valueName] = collection[i];
413-
locals[keyName] = i;
414-
if (selectAsFn(scope, locals) ==
415-
selectAsFn(scope, collectionWithValueName)) break;
416-
}
417-
418-
}
419-
} else if (trackFn) {
420-
for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {
421-
locals[valueName] = collection[trackIndex];
422-
if (trackFn(scope, locals) == key) break;
423-
}
424-
} else {
425-
locals[valueName] = collection[key];
426-
}
427-
value.push((selectAsFn || valueFn)(scope, locals));
461+
value.push(getViewValue(optionElement, scope, locals, collection, true))
428462
}
429463
}
430464
}
431465
} else {
432-
key = selectElement.val();
433-
if (key == '?') {
434-
value = undefined;
435-
} else if (key === ''){
436-
value = null;
437-
} else {
438-
if (selectAsFn) {
439-
for (i = 0; i < collection.length; i++) {
440-
locals[valueName] = collection[i];
441-
var collectionWithValueName = {};
442-
collectionWithValueName[valueName] = collection[key];
443-
444-
if (selectAsFn(scope, locals) === selectAsFn(scope, collectionWithValueName)) {
445-
value = selectAsFn(scope, locals);
446-
break;
447-
}
448-
}
449-
} else if (trackFn) {
450-
for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {
451-
locals[valueName] = collection[trackIndex];
452-
453-
if (trackFn(scope, locals) == key) {
454-
value = valueFn(scope, locals);
455-
break;
456-
}
457-
}
458-
} else {
459-
locals[valueName] = collection[key];
460-
if (keyName) locals[keyName] = key;
461-
value = valueFn(scope, locals);
462-
}
463-
}
466+
value = getViewValue(selectElement, scope, locals, collection);
464467
}
465468
ctrl.$setViewValue(value);
466469
render();

0 commit comments

Comments
 (0)