选择的自定义绑定无法将对象作为值处理
Posted
技术标签:
【中文标题】选择的自定义绑定无法将对象作为值处理【英文标题】:Custom binding for a select can not handle objects as a value 【发布时间】:2014-09-28 08:48:46 【问题描述】:我有一个设置,在其中我使用基于 observableArray 的选项填充选择。该数组包含具有更多属性的对象,而不仅仅是一个 id 和一个名称。我希望能够使用完整的 javascript 对象作为选定值。
数据是这样的:
this.optionData = ko.observableArray([
id: 1, name: "One", param: true,
id: 2, name: "Two", param: true,
id: 3, name: "Three", param: true,
]);
在淘汰赛中使用标准绑定非常简单
<select data-bind="
options: optionData,
optionsText: 'name',
optionsCaption: 'Please select',
value: selectedOption">
</select>
但是,我想为我的选择设置样式,并为它们添加更多功能。我为此使用 select2。我提出了以下自定义绑定,这适用于具有 optionsText 和 optionsValue 的简单绑定 - 但它不适用于没有 optionsValue 的选项绑定(即使用对象作为值时)。
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(valueAccessor());
$(el).select2(select2);
,
update: function (element, valueAccessor, allBindingsAccessor, viewModel)
var selectedOptions = ko.unwrap(allBindingsAccessor.get("selectedOptions")),
val = ko.unwrap(allBindingsAccessor.get("value")),
options = ko.unwrap(allBindingsAccessor.get("options"));
if ($(element).prop('multiple'))
$(element).select2('val', selectedOptions, true);
else
$(element).select2("val", val);
$(element).trigger('change');
;
我的问题是,我需要更新什么才能让我的自定义绑定作为默认的淘汰选项绑定工作?
我制作了这个小提琴来演示这个问题:http://jsfiddle.net/SuneRadich/LdF45/1/
【问题讨论】:
gist.githubusercontent.com/xtranophilist/8001624/raw/…希望对你有帮助 我不太确定这对我使用 select2 库有什么帮助?我可能遗漏了一些明显的东西。 您可以使用optionAfterRender
。看看this例子
【参考方案1】:
我的示例可能有助于使用 optionsAfterRender 获取对象。
<select id="selectArticles" multiple
data-bind="options: availableArticles, selectedOptions: selectedArticles,
optionsText: function(item)return item.title,
optionsAfterRender: function(option, item)option.value = item">
</select>
workding fiddle
如有必要,我可以将其更改为单选。
【讨论】:
【参考方案2】:您可以使用optionAfterRender
属性为您的select
添加更多功能。
考虑这个例子
<select
data-bind="
options: options,
value : selectedOption,
optionsText: 'Name',
optionsAfterRender: $root.setTitle
"
></select><br />
<button data-bind="click: showSelectedOptions">Show selection</button>
function Option(id, name)
var self = this;
self.Id = id;
self.Name = name;
function ViewModel()
var self = this;
self.options = ko.observableArray([
new Option(0, "NormalText"),
new Option(1, "AnotherText"),
new Option(2, "WaaaaaaaaaaaaaaaayTooLongText")
]);
self.selectedOption = ko.observable();
self.showSelectedOptions = function()
console.log(self.selectedOption());
self.setTitle = function(option, item)
option.title = item.Name
// other properties
ko.applyBindings(new ViewModel());
SQL Fiddle Demo
确保您拥有 3.1.0 版本
【讨论】:
以上是关于选择的自定义绑定无法将对象作为值处理的主要内容,如果未能解决你的问题,请参考以下文章