90 lines · 3.2 KB · JavaScript
RawDownload
/* jshint boss:true*/(function(factory) {    if (typeof define === 'function' && define.amd) {        define(['jquery', 'knockout', 'module'], factory);    } else {        factory(jQuery, ko);    }})(function($, ko, module) {    'use strict';     var bindingName = 'select2';    if (module && module.config() && module.config().name) {        bindingName = module.config().name;    }     var dataBindingName = bindingName + 'Data';     function triggerChangeQuietly(element, binding) {        var isObservable = ko.isObservable(binding);        var originalEqualityComparer;        if (isObservable) {            originalEqualityComparer = binding.equalityComparer;            binding.equalityComparer = function() { return true; };        }        $(element).trigger('change');        if (isObservable) {            binding.equalityComparer = originalEqualityComparer;        }    }     function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {        var bindingValue = ko.unwrap(valueAccessor());        var allBindings = allBindingsAccessor();        var ignoreChange = false;        var dataChangeHandler = null;        var subscription = null;         $(element).on('select2:selecting select2:unselecting', function() {            ignoreChange = true;        });        $(element).on('select2:select select2:unselect', function() {            ignoreChange = false;        });         if (ko.isObservable(allBindings.value)) {            subscription = allBindings.value.subscribe(function(value) {                if (ignoreChange) return;                triggerChangeQuietly(element, this._target || this.target);            });        } else if (ko.isObservable(allBindings.selectedOptions)) {            subscription = allBindings.selectedOptions.subscribe(function(value) {                if (ignoreChange) return;                triggerChangeQuietly(element, this._target || this.target);            });        }         // Provide a hook for binding to the select2 "data" property; this property is read-only in select2 so not subscribing.        if (ko.isWriteableObservable(allBindings[dataBindingName])) {            dataChangeHandler = function() {                if (!$(element).data('select2')) return;                allBindings[dataBindingName]($(element).select2('data'));            };            $(element).on('change', dataChangeHandler);        }         // Apply select2        $(element).select2(bindingValue);         // Destroy select2 on element disposal        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {            $(element).select2('destroy');            if (dataChangeHandler !== null) {                $(element).off('change', dataChangeHandler);            }            if (subscription !== null) {                subscription.dispose();            }        });    }     return ko.bindingHandlers[bindingName] = {        init: function() {            // Delay to allow other binding handlers to run, as this binding handler depends on options bindings            var args = arguments;            setTimeout(function() {                                init.apply(null, args);            }, 0);        }    };});

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t