Knockout绑定:如何更新存储在observableArray()中的对象的值



我正处于knockout.js和数据绑定的"你好世界"阶段。

我找不到绑定和更新存储在observableArray中的对象的成员值的正确方法。

绑定第一次起作用,但之后它不会在网页中更新自己。

以下是我要做的:

<div class="row" data-bind="foreach:chains">
    <div class="col-md-12">
        <h3>Obj id is <span data-bind="text: id"></span> </h3>
        <span data-bind="text: message"></span>         
        </div>
    </div>

javascript部分:

(function () {
  var Chain = function (chainId) {
    var self = this;
    self.id = chainId;
    self.message = "N/A";
    // etc. (more memberS)
};

var Model = function() {
    var self = this;
    self.chains = ko.observableArray();
};
 Model.prototype = {
    updateChains: function(updatedChains) {
         // here chain values are updated, in words:
         // if chain does not exist then create it and add it to self.chains
         // self.chains.push(newChain); 
         // otherwise update chain.message as:
         // existingChain.message = updatedMessage;
   }
var model = new Model();
$(function() {
    ko.applyBindings(model);
});
}());

我调试了代码,更新部分一切都很好,message得到了一个新值,但它在UI中不可见(它仍然是"N/a")。看来我在装订上做错了什么。

我尝试了其他几种方法,但每次都失败了。

我怎样才能做到这一点?

从Observable Arrays上的Knockout页面:

关键点:observableArray跟踪阵列中的对象,而不是这些对象的状态

简单地将一个对象放入observableArray中并不能使该对象的所有属性本身都是可观察的。当然,如果你愿意,你可以让这些属性变得可观察,但这是一个独立的选择。observableArray只跟踪它持有的对象,并在添加或删除对象时通知侦听器。

如果您希望Chain上的message是可观察的:

var Chain = function (chainId) {
    var self = this;
    self.id = chainId;
    self.message = ko.observable("N/A");
    ...
};

然后,当你想在现有的Chain上设置message时,你需要这样做:

existingChain.message(updatedMessage);

不是这个:

existingChain.message = updatedMessage

可观察数组不跟踪其内容的状态,只有当数组本身被修改时。

文件(第二段)

实现目标的一种方法是让你的Chain类的成员也能被观察到:

var Chain = function (chainId) {
    var self = this;
    self.id = chainId;
    self.message = ko.observable("N/A");
    // etc. (more members)
};

然后,您的更新功能将设置找到的对象中的可观察对象:

self.chains()[foundIndex].memberToUpdate(newValue)

最新更新