出于某种原因,我似乎无法获得ko.computed observable来计算关联值何时发生变化。
这是一个代表客户的单一奖励积分记录的对象
//
// RewardPoints Model
var RewardPointsItemModel = function (data) {
return {
DateAwarded: ko.observable((data != null) ? data.DateAwarded : ""),
Points: ko.observable((data != null) ? data.Points : 0)
}
};
我定义了一个viewModel,它包含对“OrderDetailModel”的引用。此OrderDetailModel具有一个定义为ko.observable的属性,并使用新的空OrderDetailModel实例进行初始化;用空数组初始化,并应用于由“ $ OrderDetailForm ”引用标识的HTML的approprite部分。
$j(function () {
//
// initialize global DOM references
$LoyaltyProgram = $j("#LoyaltyProgram");
$LoyaltyHistory = $j("#LoyaltyHistory");
$OrderDetailForm = $j("#OrderDetailForm");
//
// define and bind the viewModels
viewModel = {
OrderDetailModel: {
OrderDetail: ko.observable( new OrderDetailModel([]) )
}
};
ko.applyBindings(viewModel.LoyaltyHistoryOrderDetailModel, $OrderDetailForm[0]);
});
以下是“ OrderDetailModel ”对象的定义。它需要一组 RewardPointsItemModel 对象实例(如上定义)作为初始化参数“data”。最终这样做是维护一个 RewardPointsItemModels 的数组,并计算每个 RewardPointsItemModels 的Points属性的总和。首次加载页面时,会创建一个带有空数组的实例(见上文),导致计算出的“ TotalPoints ”为0(零)。
//
// OrderDetail Model
function OrderDetailModel(data) {
var self = this;
this.RewardPoints = ko.observableArray(data);
this.TotalPoints = ko.computed(function () {
var points = 0;
if (self.RewardPoints.length <= 0)
return points;
for (var i = 0; i < self.RewardPoints().length; i++) {
var record = self.RewardPoints()[i];
points += record.Points();
}
return points;
});
};
用户交互执行对WebAPI服务的调用,该服务返回奖励点记录列表,然后将该数据作为“data”参数传递给下面的回调函数。在回调函数中,我创建一个新的空数组,然后使用从WebAPI调用中检索的记录创建的 RewardPointsItemModel 对象的实例填充它。然后,我在 OrderDetailModel 的现有实例中替换ko.observableArray属性“ RewardPoints ”中的空数组值,该实例存储在ko.observable属性中... < em> viewModel.OrderDetailModel.OrderDetail ...使用我的 new rewardPoints数组。
function Callback(data) {
var rewardPoints = new Array();
for (var i = 0; i < data.ServiceModel.length; i++) {
var model = new RewardPointsItemModel(data.ServiceModel[i]);
rewardPoints.push(model);
}
viewModel.OrderDetailModel.OrderDetail().RewardPoints(rewardPoints);
};
此时我希望ko.computed observable属性“ viewModel.OrderDetailModel.OrderDetail()。TotalPoints()”重新计算,但当我在计算函数中放入跟踪代码时甚至没有被调用,这表明函数没有执行更新值。我的理解是,如果依赖属性(在本例中为RewardPoints)被更新(从空数组到填充数组),则计算属性应该重新计算。
我知道这对我来说很难解释所以我希望我已经清楚了。我希望有一个比Knoutout更流畅的人可以清楚地理解这一点,并找出为什么计算值在初始化后不会计算。
答案 0 :(得分:3)
看起来你的问题就在这里:
if (self.RewardPoints.length <= 0)
return points;
你需要这样做:
if (self.RewardPoints().length <= 0)
return points;
self.RewardPoints
是observableArray
,是一个函数。函数的长度是为函数定义的参数数量。 observableArray
没有列出任何已命名的args,因为它从参数中读取它,因此值为0.
因此,您当前的代码始终返回0并且实际上没有访问observableArray
的值来创建依赖项。