Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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 KnockoutJS-ViewModel Grandparent-Parent-Child使用ko.computed访问父/祖父母值_Javascript_Jquery_Mvvm_Knockout.js - Fatal编程技术网

Javascript KnockoutJS-ViewModel Grandparent-Parent-Child使用ko.computed访问父/祖父母值

Javascript KnockoutJS-ViewModel Grandparent-Parent-Child使用ko.computed访问父/祖父母值,javascript,jquery,mvvm,knockout.js,Javascript,Jquery,Mvvm,Knockout.js,我在knockout和knockout映射、CustomServiceWModel、WorkOrderViewModel和RepairViewModel中设置了祖父母、父母、子女视图模型关系 我想在子对象中设置一个child ko.computed值,该值取RepairView模型中的小时数,并乘以WorkOrderView模型中的速率 在RepairViewModel中,我有如下代码: self.RepairCost = ko.computed(function () {

我在knockout和knockout映射、CustomServiceWModel、WorkOrderViewModel和RepairViewModel中设置了祖父母、父母、子女视图模型关系

我想在子对象中设置一个child ko.computed值,该值取RepairView模型中的小时数,并乘以WorkOrderView模型中的速率

在RepairViewModel中,我有如下代码:

self.RepairCost = ko.computed(function () {

             return (self.Hours() * self.parent.LabourChargeCost()).toFixed(2);
     });
  ko.utils.arrayForEach(self.employees, function(i) {
      i.payout = ko.computed(function() {
          return i.hoursWorked*self.rate;
      });
  });
有没有办法得到父母的价值

非常感谢

以下是我正在使用的JS代码(简化):


除非将父对象传递给子对象并保留引用,否则无法访问子模型中的父对象

在过去,对我来说效果更好的是将值传递给子模型,然后在父模型中添加订阅,以便在值更改时更新子模型

function Parent(){
  var self = this;
  self.someValue = ko.obserable();//init if you need to
  self.children = [new Child(self.someValue())]

  self.someValue.subscribe(function(value){
      for(var i = 0;i<self.children.length;i++){
          self.children[i].parentValue(value);
      }
  });
}
function Child(value){
    var self = this;
    self.parentValue = ko.observable(value);
}
函数父函数(){
var self=这个;
self.someValue=ko.obserable();//如果需要,可以初始化
self.children=[new Child(self.someValue())]
self.someValue.subscribe(函数(值){

对于(var i=0;i不幸的是,您不能这样做,这不是敲除而是JS的限制:您不能从对象属性中访问父上下文。 正如@GrayTower所提到的,您可以将您的父级作为参数传递,但对我来说,这感觉有点像黑客(尽管我承认有时会使用它)

// symbolizes an employee
function ChildVM(name, hoursWorked) {
    var self = this, parent;
    this.name = name;
    this.hoursWorked = hoursWorked;
}
// symbolizes a payment system
function MasterVM() {
    var self = this;
    this.rate = 25; // dollars/hour
    this.employees = [
        new ChildVM('Chris',16),
        new ChildVM('Cagle',32)
    ];
}
var app = new MasterVM(), 
    view = document.getElementsByTagName('table')[0];
我们想在
employees
中为每个
ChildVM
添加一个属性
payout
,它将使用
MasterVM
中的
rate
ChildVM
中的
hoursWorked
组合,即
ko.computed
。您只需在
MasterVM
构造函数中粘贴一个函数,像这样:

self.RepairCost = ko.computed(function () {

             return (self.Hours() * self.parent.LabourChargeCost()).toFixed(2);
     });
  ko.utils.arrayForEach(self.employees, function(i) {
      i.payout = ko.computed(function() {
          return i.hoursWorked*self.rate;
      });
  });
或者您可以将其设置为方法,并在调用
ko.applyBindings
之前调用它:

    this.initEmployees = function() {
        ko.utils.arrayForEach(self.employees, function(i) {
            i.payout = ko.computed(function() {
                return i.hoursWorked*self.rate;
            });
        });
    }
    app.initEmployees();
    ko.applyBindings(app, view);
或者您甚至可以构建一个
applyBindings
包装器,它在绑定视图和模型之前执行“callBefore”(参见AJAX
callbacks
),如下所示:

function initVM(VM, callbefore, element) {
    callbefore(VM);
    ko.applyBindings(VM, element);
}
initVM(app, function(vm) {
   ko.utils.arrayForEach(vm.employees, function(i) {
     i.payout = ko.computed(function() {
        return i.hoursWorked*vm.rate;
     });
   });
},view);

注意:使用
ko.mapping.fromJS
所有值转换为可观察值,而当您的值不需要更新时,您不需要可观察值,您可以使用普通的JS值/对象