Javascript KnockoutJS-ViewModel Grandparent-Parent-Child使用ko.computed访问父/祖父母值
我在knockout和knockout映射、CustomServiceWModel、WorkOrderViewModel和RepairViewModel中设置了祖父母、父母、子女视图模型关系 我想在子对象中设置一个child ko.computed值,该值取RepairView模型中的小时数,并乘以WorkOrderView模型中的速率 在RepairViewModel中,我有如下代码: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 () {
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”(参见AJAXcallbacks
),如下所示:
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值/对象