未执行计算可观察量
computed observable is not being executed
由于某种原因,我似乎无法在相关值更改时获得 ko.computed 可观察的可观察值
。这是一个对象,表示客户的单个奖励积分记录
//
// RewardPoints Model
var RewardPointsItemModel = function (data) {
return {
DateAwarded: ko.observable((data != null) ? data.DateAwarded : ""),
Points: ko.observable((data != null) ? data.Points : 0)
}
};
我定义了一个单一的视图模型,其中包含对"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"。最终,这样做是维护一个奖励积分项目模型数组,并计算每个奖励积分项目模型的积分属性的总和。首次加载页面时,将使用空数组(见上文)创建此实例,导致计算的"总点数"为 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 对象的实例填充它。然后,我将存储在 ko.observable 属性中的 ko.observableArray 属性"奖励积分"中的空数组值替换在存储在 ko.observable 属性中的现有实例中......viewModel.OrderDetailModel.OrderDetail ...使用我的新奖励积分数组。
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()"来重新计算,但是当我在计算函数中放入跟踪代码时,它甚至没有被调用,这表明该函数没有执行以更新值。我的理解是,如果依赖项属性(在本例中为奖励积分)已更新(从空数组到填充数组),则计算属性应重新评估。
我知道这对我来说解释起来很复杂,所以我希望我已经清楚了。我希望有人比我更精通 Knockout,可以清楚地理解这一点,并找出为什么初始化后计算的值没有计算。
看起来你的问题就在这里:
if (self.RewardPoints.length <= 0)
return points;
您需要做:
if (self.RewardPoints().length <= 0)
return points;
self.RewardPoints
是一个observableArray
,它是一个函数。 函数的长度是为函数定义的参数数。 observableArray
不会列出任何命名的参数,因为它从参数中读取它,因此值为 0。
因此,当前代码始终返回 0,而不是实际访问observableArray
的值来创建依赖项。
- 下拉列表未从计算的可观察项更新
- 在编辑记录上可观察的挖空 JS 计算
- 挖空映射:加载数据后,父模型中的计算可观察量不会更新
- Knockout.js:在可选定义的值上计算可观察性
- 如何使用ES6在Ember中声明可观察性或计算属性
- 击倒计算的可观察到的未发射'写'
- 向KO传递在对象内可观察到的计算值
- 如何使某些可观察的“独立”计算可观察(Knockout.js)
- 如何在运行时向计算可观察量添加其他数组项
- Knockout.js - 如何在计算的可观察量中获取可观察属性的值
- 在不重置对象的情况下重新计算计算可观察量
- 从计算的可观察量中获取价值
- Knockout的可写计算在AngularJS中可观察的模拟是什么?
- 使挖空计算订阅不在初始执行路径中的可观察量
- 如何在淘汰.js中实现可计算的可观察量
- 根据异步数据计算的可观察量
- .replace() 表达式未在计算可观察量中更新
- 对计算可观察量的挖空 JS 绑定不起作用
- 挖空添加计算中断可观察数组
- 将通过原型计算的可观察对象添加到构造函数中