javascript - 在knockoutJS中绑定(bind)到可观察数组的问题

标签 javascript jquery arrays knockout.js ko.observablearray

我目前在将数据绑定(bind)到knockoutJS 中的可观察数组时遇到问题。我想做的是根据用户从选择框中的选择显示新值。

fiddle 可在 http://jsfiddle.net/jwayne2978/k0coh1fz/3/ 获取。

我的 HTML 如下所示。

<select data-bind="options: categories, 
    optionsText: 'name',
    optionsValue: 'id',
    value: selectedCategory,
    optionsCaption: 'Choose...',
    event: { change: categoryChanged }
    ">
<div data-bind="foreach: values">
    <div data-bind="text: name"></div>
</div>
<div data-bind="foreach: categories">
    <div data-bind="text: name"></div>
</div>

我的 JavaScript 如下所示。

var categories = [
    { "name" : "color", "id": "1" },
    { "name" : "names", "id": "2" }
];
var values0 = [ { "name" : "empty1" }, { "name" : "empty2" } ];
var values1 = [ { "name" : "white" }, { "name" : "black" } ];
var values2 = [ { "name" : "john" }, { "name" : "name" } ];
var Category = function(data) {
    this.name = ko.observable(data.name);
    this.id =  ko.observable(data.id);
};
var Value = function(data) {
    this.name = ko.observable(data.name);
}
var ViewModel = function(categories, values) {
    var self = this;
    self.categories = ko.observableArray(ko.utils.arrayMap(categories, function(category) {
        return new Category(category);
    }));
    self.selectedCategory = ko.observable();
    self.values = ko.observableArray(ko.utils.arrayMap(values, function(value) {
        return new Value(value);
    }));
    self.categoryChanged = function(obj, event) {
        if(self.selectedCategory()) {
            console.log(self.selectedCategory());
            if("1" == self.selectedCategory()) {
                //console.log(values1);
                self.values.push(new Value({"name":"test1"}));
            } else if("2" == self.selectedCategory()) {
                //console.log(values2);
                self.values.push(new Value({"name":"test2"}));
            }
        }
    };
};
var viewModel;
$(document).ready(function() { 
    viewModel = new ViewModel(categories, values0);
    ko.applyBindings(viewModel);
});

当类别发生变化时,我真正想做的就是这样的事情。

self.values.removeAll();
for(var v in values1) {
 self.values.push(new Value(v));
}

但这不起作用,所以我只需将新值插入可观察数组即可。

此外,我对 valuescategories 的 div 的迭代没有显示,我不确定为什么。

知道我做错了什么吗?

最佳答案

您的<select>元素缺少结束标签并导致 View 中进一步出现问题。

<select data-bind="options: categories, 
    optionsText: 'name',
    optionsValue: 'id',
    value: selectedCategory,
    optionsCaption: 'Choose...',
    event: { change: categoryChanged }"></select>

更新了 fiddle :http://jsfiddle.net/ragnarok56/69q8xmrp/

关于javascript - 在knockoutJS中绑定(bind)到可观察数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25194537/

相关文章:

arrays - 如何制作一个接受数组 * 或 * 可变数量标量的子程序?

python - 为什么这个二进制文件的大小是相等的,尽管它们不应该相等?

javascript - 如何在 Bootstrap 标签输入上应用谷歌自动完成功能?

javascript - iframe 和 tokenizers 和 css

javascript - 根据用户选择的纸张尺寸打印适合尺寸的 html 表格

javascript - 使用 jQuery 更改文本框值

javascript - 如何删除背景图像溢出?

javascript - flash as3 - 通过actionscript 3从DOM获取数据

Ruby:根据条件拆分/排序数组

javascript - 如何在我的函数中使用 .bind()