Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算的可观测值不';在ko.mapping.fromJS之后重新调用_Javascript_Jquery_Mvvm_Knockout.js - Fatal编程技术网

Javascript 计算的可观测值不';在ko.mapping.fromJS之后重新调用

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结构的映射中,我需要做什么来计算这个总量 我已经尝试过用虚拟的可观察对象来实现这一点,但这极大地减慢了加载过程(浏览器崩溃,挂断) 提

我使用的是KnockoutJS,我有一个嵌套的ViewModel结构,每个级别上都有计算出的观测值。父级包含其子级的总和。数据结构如下所示(简化):

在初始化ViewModel(使用ko.mapping.fromJS)之后,我看到“顶层(例如,vm.AllUsd(),包含每个客户机帐户的总和)”上的ComputedObservable没有刷新。总数仍然是0。在JS结构的映射中,我需要做什么来计算这个总量

我已经尝试过用虚拟的可观察对象来实现这一点,但这极大地减慢了加载过程(浏览器崩溃,挂断)

提前谢谢

更新:例如,这个例子。我发现,在序列化之后,客户端计数为0。但是为什么呢

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)())