Commit 6dc16da0 authored by David Stutz's avatar David Stutz

Merge pull request #244 from BrewDawg/master

Full Knockout Support.
parents cf1935f2 a890e11c
...@@ -12,26 +12,65 @@ ...@@ -12,26 +12,65 @@
if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) { if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {
ko.bindingHandlers.multiselect = { ko.bindingHandlers.multiselect = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var config = ko.utils.unwrapObservable(valueAccessor()); init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var selectOptions = allBindingsAccessor().options;
var ms = $(element).data('multiselect'); var listOfSelectedItems = allBindingsAccessor().selectedOptions,
config = ko.utils.unwrapObservable(valueAccessor());
$(element).multiselect(config);
if (isObservableArray(listOfSelectedItems)) {
// Subscribe to the selectedOptions: ko.observableArray
listOfSelectedItems.subscribe(function (changes) {
var addedArray = [], deletedArray = [];
changes.forEach(function (change) {
switch (change.status) {
case 'added':
addedArray.push(change.value);
break;
case 'deleted':
deletedArray.push(change.value);
break;
}
});
if (addedArray.length > 0) {
$(element).multiselect('select', addedArray);
};
if (deletedArray.length > 0) {
$(element).multiselect('deselect', deletedArray);
};
}, null, "arrayChange");
}
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var listOfItems = allBindingsAccessor().options,
ms = $(element).data('multiselect'),
config = ko.utils.unwrapObservable(valueAccessor());
if (isObservableArray(listOfItems)) {
// Subscribe to the options: ko.observableArray incase it changes later
listOfItems.subscribe(function (theArray) {
$(element).multiselect('rebuild');
});
}
if (!ms) { if (!ms) {
$(element).multiselect(config); $(element).multiselect(config);
} }
else { else {
ms.updateOriginalOptions(); ms.updateOriginalOptions();
if (selectOptions && selectOptions().length !== ms.originalOptions.length) {
$(element).multiselect('rebuild');
}
} }
} }
}; };
} }
function isObservableArray(obj) {
return ko.isObservable(obj) && !(obj.destroyAll === undefined);
}
/** /**
* Constructor to create a new multiselect using the given select. * Constructor to create a new multiselect using the given select.
* *
...@@ -686,6 +725,27 @@ ...@@ -686,6 +725,27 @@
this.updateButtonText(); this.updateButtonText();
}, },
/**
* Clears all selected items
*
*/
clearSelection: function () {
var selected = this.getSelected();
if (selected.length) {
var arry = [];
for (var i = 0; i < selected.length; i = i + 1) {
arry.push(selected[i].value);
}
this.deselect(arry);
this.$select.change();
}
},
/** /**
* Deselects all options of the given values. * Deselects all options of the given values.
* *
...@@ -844,10 +904,17 @@ ...@@ -844,10 +904,17 @@
* @param {String} value * @param {String} value
* @returns {jQuery} * @returns {jQuery}
*/ */
getOptionByValue: function(value) { getOptionByValue: function (value) {
return $('option', this.$select).filter(function() {
return $(this).val() === value; var options = $('option', this.$select);
}); var valueToCompare = value.toString();
for (var i = 0; i < options.length; i = i + 1) {
var option = options[i];
if (option.value == valueToCompare) {
return $(option);
}
}
}, },
/** /**
...@@ -856,10 +923,17 @@ ...@@ -856,10 +923,17 @@
* @param {String} value * @param {String} value
* @returns {jQuery} * @returns {jQuery}
*/ */
getInputByValue: function(value) { getInputByValue: function (value) {
return $('li input', this.$ul).filter(function() {
return $(this).val() === value; var checkboxes = $('li input', this.$ul);
}); var valueToCompare = value.toString();
for (var i = 0; i < checkboxes.length; i = i + 1) {
var checkbox = checkboxes[i];
if (checkbox.value == valueToCompare) {
return $(checkbox);
}
}
}, },
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment