gpt4 book ai didi

javascript - 未执行计算的可观察对象

转载 作者:行者123 更新时间:2023-11-30 13:21:47 24 4
gpt4 key购买 nike

出于某种原因,当关联值发生变化时,我似乎无法获得 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 的适当部分。

$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 对象实例(如上定义)作为初始化参数“数据”。最终,它所做的是维护一个 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 服务的调用,然后将该数据作为“数据”参数传递给下面的回调函数。在回调函数中,我创建了一个新的空数组,然后用从 WebAPI 调用检索到的记录创建的 RewardPointsItemModel 对象的实例填充它。然后,我将存储在 ko.observable 属性中的 OrderDetailModel 的现有实例中的 ko.observableArray 属性“RewardPoints”中的空数组值替换为 ... < em>viewModel.OrderDetailModel.OrderDetail ... 使用我的新 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 可观察属性“viewModel.OrderDetailModel.OrderDetail().TotalPoints()”重新计算,但是当我将跟踪代码放入计算函数中时,它甚至没有被调用,这表明该函数未执行以更新值。据我了解,如果依赖属性(在本例中为 RewardPoints)已更新(从空数组到填充数组),则计算属性应重新评估。

我知道这对我来说解释起来很复杂,所以我希望我已经说清楚了。我希望有比我更精通 Knockout 的人能够清楚地理解这一点,并找出为什么计算值在初始化后不计算。

最佳答案

看来您的问题出在这里:

if (self.RewardPoints.length <= 0)
return points;

你需要做的:

if (self.RewardPoints().length <= 0)
return points;

self.RewardPoints 是一个observableArray,它是一个函数。函数的长度是为函数定义的参数的数量。 observableArray 没有列出任何命名的参数,因为它是从参数中读取的,所以值为 0。

因此,您当前的代码总是返回 0 而不是实际访问 observableArray 的值来创建依赖项。

关于javascript - 未执行计算的可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com