custom_bindings/select2.js

/**
 * Currently unused. Binding for select2 library, copied somwhere in their documentation
 * @module app/custom_bindings/select2
 * @requires knockout
 * @requries select2                                                           ko.bindingHandlers.select2 [description]
 */
define(['knockout', 'select2'], function(ko) {
    ko.bindingHandlers.select2 = {
        init: function(el, valueAccessor, allBindingsAccessor, viewModel) {
            ko.utils.domNodeDisposal.addDisposeCallback(el, function() {
                $(el).select2('destroy');
            });

            var allBindings = allBindingsAccessor(),
                select2 = ko.utils.unwrapObservable(allBindings.select2);

            $(el).select2(select2);
        },
        update: function(el, valueAccessor, allBindingsAccessor, viewModel) {
            var allBindings = allBindingsAccessor();

            if ("value" in allBindings) {
                if ((allBindings.select2.multiple || el.multiple) && allBindings.value().constructor != Array) {
                    $(el).val(allBindings.value().split(',')).trigger('change');
                } else {
                    $(el).val(allBindings.value()).trigger('change');
                }
            } else if ("selectedOptions" in allBindings) {
                var converted = [];
                var textAccessor = function(value) {
                    return value;
                };
                if ("optionsText" in allBindings) {
                    textAccessor = function(value) {
                        var valueAccessor = function(item) {
                            return item;
                        }
                        if ("optionsValue" in allBindings) {
                            valueAccessor = function(item) {
                                return item[allBindings.optionsValue];
                            }
                        }
                        var items = $.grep(allBindings.options(), function(e) {
                            return valueAccessor(e) == value
                        });
                        if (items.length == 0 || items.length > 1) {
                            return "UNKNOWN";
                        }
                        return items[0][allBindings.optionsText];
                    }
                }
                $.each(allBindings.selectedOptions(), function(key, value) {
                    converted.push({
                        id: value,
                        text: textAccessor(value)
                    });
                });
                $(el).select2("data", converted);
            }
            console.log(allBindings);
        }
    };

});