рдореИрдВ рдиреЙрдХрдЖрдЙрдЯ рд╕рд┐рд▓реЗрдХреНрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ ... рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧред
рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдорд▓реНрдЯреАрд╕реЗрд▓реЗрдХреНрдЯ рдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреА рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЪрдпрди рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП "рдорд╛рди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдиреЙрдХрдЖрдЙрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ "рд╡рд┐рдХрд▓реНрдк рд╡реИрд▓реНрдпреВ" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдиреА рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ "рдорд╛рди" рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рд╡рд┐рдХрд▓реНрдк рд╡реИрд▓реНрдпреВ" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдЪрдпрдирд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдорд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ ... рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБ рдирд╣реАрдВред
рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реВрдВ рдЬреЛ рдиреЙрдХрдЖрдЙрдЯ рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдирд╣реАрдВ рд╣реВрдВ ... рдпрд╣рд╛рдВ рд╣реИрдХ рдлрд┐рдХреНрд╕ рд╣реИ:
"рд╡рд┐рдХрд▓реНрдкрдХреА" рдФрд░ "рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдпрдХреА" рдирд╛рдордХ рджреЛ рдирдП рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдмрд╣реБ-рдЪрдпрди рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдП рддрд╛рдХрд┐ рдпрд╣ рдЬрд╛рди рд╕рдХреЗ рдХрд┐ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
<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);
}
}
},
рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛! рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдорджрджрдЧрд╛рд░ рд╣реИред
рдЗрд╕ рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдореИрдВ рдЪреБрдирд┐рдВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдмрд╛рдзреНрдпрдХрд╛рд░реА рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ @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
рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдЬреЛрдбрд╝рд╛ред