不能正确绑定observable的数组

Can not properly bind observableArray of observables

本文关键字:数组 observable 绑定 不能      更新时间:2023-09-26

我有下面的代码,它应该绑定observable的observableArray。

<button data-bind="click: loadTag">Upload</button>
<span data-bind="foreach: langs">
    <input data-bind="value: $data, valueUpdate: 'afterkeydown'"/>
</span>
<div data-bind = "text: ko.toJS(langs)">
function vm() {
    var self = this;
    this.langs      = ko.observableArray([]);
    this.initiate = function(){
        self.langs = ko.observableArray([]);
        for (var i = 0; i < 4; i++){
            self.langs.push(ko.observable('start'));
        }
    }
    this.initiate();
    this.loadTag = function(){
        for (var i = 0; i < 4; i++){
            self.langs()[i](i);
        }
    }
}
ko.applyBindings(new vm());

JS fiddle可用

正如你在开始看到的,它正确地绑定了,当它加载标签时,绑定也能工作。但问题是,当我修改input中的元素时,绑定不会传播。我想我错过的东西真的很简单,只是找不到什么。

如果你在数组中直接有ko.observable对象,你需要使用$rawData而不是$data来直接绑定到可观察对象本身,而不是它们的值:

<span data-bind="foreach: langs">
    <input data-bind="value: $rawData, valueUpdate: 'afterkeydown'"/>
</span>

JSFiddle演示。

来自文档:

$rawData

这是当前上下文中的原始视图模型值。通常这将是相同的$data,但如果视图模型提供给Knockout被封装在一个可观察对象中,$data将是未封装的视图模型,和$rawData将是可观察对象本身。