我只是想發佈一個解決方案,我最近使用來解決這個問題。它利用綁定處理程序(valueAppendText和textFromOption)並將可觀察對象附加到正在由下拉列表跟蹤的可觀察對象。此解決方案不完整,但演示了不使用添加計算來獲取下拉文本的想法。這個解決方案也使用了jQuery,它可以被刪除,但是因爲我在我的項目中使用了jQuery(主要是),所以我將它留下了。下面的jsFiddle鏈接演示了這個功能。
小提琴: http://jsfiddle.net/FjRxn/65/
標記:
<select data-bind="options: availableGroups, optionsText: 'Name', optionsValue: 'GroupId', valueAppendText: selectedGroup, optionsCaption: 'Choose...'"></select>
<p>
I am visible
You have chosen <span data-bind="textFromOption: selectedGroup"></span>
<div>
Group Id: <span data-bind="text: selectedGroup"></span>
</div>
</p>
裝訂處理程序:
ko.bindingHandlers.valueAppendText = {
init: function(element, valueAccessor, allBindingsAccessor, context) {
var $element, newValueAccessor, observable, setText;
observable = valueAccessor();
observable.selectedOptionText = ko.observable(null);
newValueAccessor = function() {
return observable;
};
$element = $(element);
setText = function() {
return observable.selectedOptionText($element.find("option:selected").text());
};
setTimeout(setText, 5);
$element.change(function() {
return setText();
});
return ko.bindingHandlers.value.init(element, newValueAccessor, allBindingsAccessor, context);
},
update: function(element, valueAccessor, allBindingsAccessor, context) {
return ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, context);
}
};
ko.bindingHandlers.textFromOption = {
update: function(element, valueAccessor, allBindingsAccessor, context) {
var newValueAccessor, observable;
observable = valueAccessor();
newValueAccessor = function() {
if (ko.isObservable(observable.selectedOptionText)) {
return observable.selectedOptionText();
}
return observable();
};
return ko.bindingHandlers.text.update(element, newValueAccessor, allBindingsAccessor, context);
}
};
爲什麼不使用下拉文本值? – DevelopmentIsMyPassion 2013-02-13 21:43:01
我現在看到我正在嘗試使用所有設置爲生成標記中的groupid字段的選項值生成下拉列表,這不是必需的。所以即使這些值沒有在標記中設置,當我檢索選定的項目時,我可以將GroupId字段作爲選定組對象的一部分。 – voam 2013-02-13 22:08:06