Skip to content

Commit 8cc4918

Browse files
committed
fix(isDisabled): do not modify item
Previously the item from the list was modified with the _uiSelectChoiceDisabled property. This allowed a leakage of information from ui-select to outside the directive. It also caused issues when the was used outside of the directive. This commit adds a reference array to store disabled items and so prevents the need to modify the item in place. Closes angular-ui#1200 and angular-ui#1661 Partially supersedes angular-ui#1641
1 parent 43c1e4d commit 8cc4918

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

src/uiSelectController.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,18 +324,43 @@ uis.controller('uiSelectCtrl',
324324
ctrl.selected.filter(function (selection) { return angular.equals(selection, item); }).length > 0);
325325
};
326326

327+
var disabledItems = [];
328+
329+
function _updateItemDisabled(item, isDisabled) {
330+
var disabledItemIndex = disabledItems.indexOf(item);
331+
if (isDisabled && disabledItemIndex === -1) {
332+
disabledItems.push(item);
333+
}
334+
335+
if (!isDisabled && disabledItemIndex > -1) {
336+
disabledItems.splice(disabledItemIndex, 0);
337+
}
338+
}
339+
340+
function _isItemDisabled(item) {
341+
return disabledItems.indexOf(item) > -1;
342+
}
343+
327344
ctrl.isDisabled = function(itemScope) {
328345

329346
if (!ctrl.open) return;
330347

331-
var itemIndex = ctrl.items.indexOf(itemScope[ctrl.itemProperty]);
348+
var item = itemScope[ctrl.itemProperty];
349+
var itemIndex = ctrl.items.indexOf(item);
332350
var isDisabled = false;
333-
var item;
334-
335-
if (itemIndex >= 0 && (!angular.isUndefined(ctrl.disableChoiceExpression) || ctrl.multiple)) {
351+
352+
if (itemIndex >= 0 && (angular.isDefined(ctrl.disableChoiceExpression) || ctrl.multiple)) {
336353
item = ctrl.items[itemIndex];
337-
isDisabled = !!(itemScope.$eval(ctrl.disableChoiceExpression)) || _isItemSelected(item); // force the boolean value
338-
item._uiSelectChoiceDisabled = isDisabled; // store this for later reference
354+
355+
if (ctrl.multiple) {
356+
isDisabled = _isItemSelected(item);
357+
}
358+
359+
if (!isDisabled && angular.isDefined(ctrl.disableChoiceExpression)) {
360+
isDisabled = !!(itemScope.$eval(ctrl.disableChoiceExpression));
361+
}
362+
363+
_updateItemDisabled(item, isDisabled);
339364
}
340365

341366
return isDisabled;
@@ -344,11 +369,11 @@ uis.controller('uiSelectCtrl',
344369

345370
// When the user selects an item with ENTER or clicks the dropdown
346371
ctrl.select = function(item, skipFocusser, $event) {
347-
if (item === undefined || !item._uiSelectChoiceDisabled) {
372+
if (item === undefined || !_isItemDisabled(item)) {
348373

349374
if ( ! ctrl.items && ! ctrl.search && ! ctrl.tagging.isActivated) return;
350375

351-
if (!item || !item._uiSelectChoiceDisabled) {
376+
if (!item || !_isItemDisabled(item)) {
352377
if(ctrl.tagging.isActivated) {
353378
// if taggingLabel is disabled and item is undefined we pull from ctrl.search
354379
if ( ctrl.taggingLabel === false ) {

0 commit comments

Comments
 (0)