Javascript 计算的可观测值不';在ko.mapping.fromJS之后重新调用
我使用的是KnockoutJS,我有一个嵌套的ViewModel结构,每个级别上都有计算出的观测值。父级包含其子级的总和。数据结构如下所示(简化): 在初始化ViewModel(使用ko.mapping.fromJS)之后,我看到“顶层(例如,vm.AllUsd(),包含每个客户机帐户的总和)”上的ComputedObservable没有刷新。总数仍然是0。在JS结构的映射中,我需要做什么来计算这个总量 我已经尝试过用虚拟的可观察对象来实现这一点,但这极大地减慢了加载过程(浏览器崩溃,挂断) 提前谢谢 更新:例如,这个例子。我发现,在序列化之后,客户端计数为0。但是为什么呢Javascript 计算的可观测值不';在ko.mapping.fromJS之后重新调用,javascript,jquery,mvvm,knockout.js,Javascript,Jquery,Mvvm,Knockout.js,我使用的是KnockoutJS,我有一个嵌套的ViewModel结构,每个级别上都有计算出的观测值。父级包含其子级的总和。数据结构如下所示(简化): 在初始化ViewModel(使用ko.mapping.fromJS)之后,我看到“顶层(例如,vm.AllUsd(),包含每个客户机帐户的总和)”上的ComputedObservable没有刷新。总数仍然是0。在JS结构的映射中,我需要做什么来计算这个总量 我已经尝试过用虚拟的可观察对象来实现这一点,但这极大地减慢了加载过程(浏览器崩溃,挂断) 提
var ClientsMapping = {
create: function (options) {
var client = ko.mapping.fromJS(options.data, ContainersMapping)
//Some computed observables for level one here...
return client;
}
}
var ContainersMapping = {
'Containers': {
create: function (options) {
var container = ko.mapping.fromJS(options.data, MoneyAccountsMapping)
container.totalChf = ko.computed(function () {
var total = 0;
$.each(container.MoneyAccounts(), function () {
if (this.Currency() == "CHF") {
total += this.Amount();
}
})
return total;
})
//Some computed observables for level two here...
return container;
}
}
}
var MoneyAccountsMapping = {
'MoneyAccounts': {
create: function (options) {
var macc = new MoneyAccountModel(options.data)
//Some computed observables for level three here...
return macc;
}
}
}
var ClientModel = function (data) {
ko.mapping.fromJS(data, {}, this);
}
var ContainerModel = function (data) {
ko.mapping.fromJS(data, {}, this);
}
var MoneyAccountModel = function (data) {
ko.mapping.fromJS(data, {}, this);
}
var data = [
{
'Clients': 'Thomas',
'Containers': [
{
'ContName': 'Cont01',
'MoneyAccounts': [
{ Currency: "CHF", Amount: 1000 },
]
}
]
},
{
'Clients': 'Ann',
'Containers': [
{
'ContName': 'Cont01',
'MoneyAccounts': [
{ Currency: 'CHF', Amount: 1000 },
{ Currency: 'EUR', Amount: 500 }
]
}
]
}
]
function viewModel() {
var self = this;
self.clients = ko.observableArray()
self.clientsCount = ko.computed(function () {
return self.clients().length
})
}
var vm;
$(function () {
vm = new viewModel();
vm.clients = ko.mapping.fromJS(data, ClientsMapping);
})
好的,明白了。我不得不这样给客户打电话:
vm.clients(ko.mapping.fromJS(data, ClientsMapping)())
非常感谢Eric为我指明了正确的方向。你救了我!:-) 能否添加用于创建ViewModel的代码?需要注意的一点是,ko.mapping.fromJS()将在每次调用时创建一个新引用。因此,如果您调用vm.clientList=ko.mapping.fromJS(vm.clientsRawData)并创建一些可观察对象,那么如果您再次调用vm.clientList=ko.mapping.fromJS(vm.clientsRawData),它将创建一个新引用,但计算出的观测值仍将指向旧的参考。请将解决方案发布为以下答案:使其他人更容易发现。@Jeroen Done。谢谢你的反馈。
vm.clients(ko.mapping.fromJS(data, ClientsMapping)())