我正处于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)