我有一个多选列表,我在KO网站上实现了following the instructions。我的代码的重要部分目前看起来像这样(删除了不必要的代码):
function Attribute(data) {
var self = this;
self.Id = data.Id;
self.Name = data.Name;
}
// Individual Row in Table
function Criteria(data) {
var self = this;
self.Attributes = data.Attributes;
}
// Represent the ViewModel for attributes.
function CriteriaViewModel() {
var self = this;
// Catalog Data
self.availableAttributes = window.ko.observableArray([]);
$.getJSON(window.attributeListUrl, function(availableData) {
self.availableAttributes($.map(availableData.Attributes, function(item) { return new Attribute(item); }));
});
// Editable Data
self.criterion = window.ko.observableArray([]);
// Load initial state from server
$.getJSON(window.criteriaListUrl, function (availableData) {
self.criterion($.map(availableData.Criterion, function (item) { return new Criteria(item); }));
});
}
然后,在我的HTML中,我将它们绑定在一起(或者,我至少尝试):
<tbody data-bind="foreach: criterion">
<tr>
<td>
<select class="selectedAttributes"
data-bind="options: $root.availableAttributes, selectedOptions: Attributes, optionsText: 'Name', optionsValue: 'Id'"
multiple
size="6">
</select>
</td>
</tr>
</tbody>
正确显示可能的选项。但是,标准的属性与可能的选项之间没有明显的约束。从阅读指南,似乎KO应该能够直接绑定对象。任何人都可以在这里提供指导吗?
我忘了提及除了多选列表的实际绑定外,一切都有效。我正在适当地应用我的绑定 - 只是没有多选列表。
答案 0 :(得分:5)
Criteria对象上的attributes属性需要是observableArray。这是Jsfiddle demonstrating
function Criteria(data) {
var self = this;
self.Attributes = ko.observableArray(data.Attributes);
}
答案 1 :(得分:-1)
var x= $('#select1 option:selected');
if(x.length>0){
x.each(function(){
alert($(this).text());
self.selectedCategory.push(new categoryModel($(this).text()));
$('#select1 option:selected').remove();
});
}