Bootstrap-multiselect: рдиреЙрдХрдЖрдЙрдЯрдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА (рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рдирд╣реАрдВ) ... рд╣реИрдХ рдлрд┐рдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдордИ 2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: davidstutz/bootstrap-multiselect

рдореИрдВ рдиреЙрдХрдЖрдЙрдЯ рд╕рд┐рд▓реЗрдХреНрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ ... рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧред

рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ рдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреА рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЪрдпрди рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП "рдорд╛рди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдиреЙрдХрдЖрдЙрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ "рд╡рд┐рдХрд▓реНрдк рд╡реИрд▓реНрдпреВ" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдиреА рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ "рдорд╛рди" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рд╡рд┐рдХрд▓реНрдк рд╡реИрд▓реНрдпреВ" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдЪрдпрдирд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдорд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ ... рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБ рдирд╣реАрдВред

рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реВрдВ рдЬреЛ рдиреЙрдХрдЖрдЙрдЯ рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдирд╣реАрдВ рд╣реВрдВ ... рдпрд╣рд╛рдВ рд╣реИрдХ рдлрд┐рдХреНрд╕ рд╣реИ:

"рд╡рд┐рдХрд▓реНрдкрдХреА" рдФрд░ "рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдпрдХреА" рдирд╛рдордХ рджреЛ рдирдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдмрд╣реБ-рдЪрдпрди рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдП рддрд╛рдХрд┐ рдпрд╣ рдЬрд╛рди рд╕рдХреЗ рдХрд┐ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

<select id="mySelect" data-bind="options: myOptions, selectedOptions: mySelectedOptions, optionsText: 'myDisplayText', optionsAfterRender: SetOptionKey, multiselect: { optionsKey: 'data-key', observableKey: 'Key' }" multiple="multiple"></select>

рдореЗрд░реЗ рдиреЙрдХрдЖрдЙрдЯ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдкрд░ "рд╡рд┐рдХрд▓реНрдкрдХреА" рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ:

myVM.SetOptionKey = function ( option, item ) {
    ko.applyBindingsToNode( option, { attr: { "data-key": item.Key } }, item );
};

рдЕрдм рдореИрдВ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реВрдБред рдпрд╣рд╛рдВ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЬреЛ рдХрд░рдирд╛ рдерд╛ рд╡рд╣ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдиреЙрдХрдЖрдЙрдЯ рдЗрдирд┐рдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
    ...
    if (allBindings.has('selectedOptions')) {
        var selectedOptions = allBindings.get('selectedOptions');
        if (ko.isObservable(selectedOptions)) {
            ko.computed({
                read: function () {
                    selectedOptions();

                    // Added to handle knockout binding to an object...not just a value
                    // multiselect needs the selected property on the options, else it wont show them on refresh
                    if ((config.optionsKey !== undefined) &&
                        (config.optionsKey !== null) &&
                        (config.optionsKey.length > 0) &&
                        (config.observableKey !== undefined) &&
                        (config.observableKey !== null) &&
                        (config.observableKey.length > 0)) {
                        var _optionsKey = config.optionsKey;
                        var _observableKey = config.observableKey;
                        ko.utils.arrayForEach(selectedOptions(), function (selectedOption) {
                            $("option[" + _optionsKey + "='" + selectedOption[_observableKey]() + "']", $element).prop('selected', true);
                        })
                    }

                    setTimeout(function () {
                        $element.multiselect('refresh');
                    }, 1);
                },
                disposeWhenNodeIsRemoved: element
            }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
        }
    }
    ...

рдЗрд╕рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ.рдЬреЗрдПрд╕ рдореЗрдВ createOptionValue рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рдЗрд╕ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдЗрд╕рдХреА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдореЗрдВ рд╕реЗрдЯ рд╣реИ:

createOptionValue: function (element) {
    ...

    var value = $element.val();
    // Added to handle knockout binding to an object...not just a value
    if ((this.options.optionsKey !== undefined) && (this.options.optionsKey !== null) && (this.options.optionsKey.length > 0)) {
        var key = $element.attr(this.options.optionsKey);
        if ((key !== undefined) && (key !== null) && (key.length > 0)) {
            value = key;
        }
    }

    ...
}

рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдХрд▓реНрдк рддрддреНрд╡реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ.рдЬреЗрдПрд╕ рдореЗрдВ getOptionByValue рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛:

getOptionByValue: function (value) {
    var valueToCompare = value.toString();

    // Added to handle knockout binding to an object...not just a value
    if ((this.options.optionsKey !== undefined) && (this.options.optionsKey !== null) && (this.options.optionsKey.length > 0)) {
        var opt = $("option[" + this.options.optionsKey + "='" + valueToCompare + "']", this.$select).first();
        if( (opt !== undefined) && (opt !== null) ) {
            return $(opt);
        }
    }

    var options = $('option', this.$select);

    for (var i = 0; i < options.length; i = i + 1) {
        var option = options[i];
        if (option.value === valueToCompare) {
            return $(option);
        }
    }
},

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛! рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдорджрджрдЧрд╛рд░ рд╣реИред

рдЗрд╕ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдореИрдВ рдЪреБрдирд┐рдВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдмрд╛рдзреНрдпрдХрд╛рд░реА рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ @APM3 рдХреЗ рдХреЛрдб рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд░рдиреА рдереА, рд╡рд╣ рд╣реИ SetOptionKey рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореЗрд░реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА "рдорд╛рди" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдирд╛:

self.SetOptionKey = function (option, item) { ko.applyBindingsToNode(option, { attr: { "data-key": item.Value } }, item); ko.applyBindingsToNode(option, { attr: { "value": item.Value } }, item); }

рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред

рд╕рдорд░реНрдерд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдиреЙрдХрдЖрдЙрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░ рджреЗрдЦреЗрдВред рдмрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрджрд▓реЗрдВред рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЖрдкрдХреЛ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реАрдПрдо рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

//Just like this one
myVM.SetOptionKey = function ( option, item ) {
    ko.applyBindingsToNode( option, { attr: { "data-key": item.Key } }, item );
};

рдореИрдВрдиреЗ optionsAfterRender рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдЬреЛрдбрд╝рд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Calaelen picture Calaelen  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bartclaeys picture bartclaeys  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

andriijas picture andriijas  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

webakimbo picture webakimbo  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

petukhov-ds picture petukhov-ds  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ