我无法完全理解如何做到这一点。我从 Julie Lerman 的“BreezyDevices”解决方案开始学习,并以她的 javascript 视图模型为基础。
我有:
//properties and methods to expose via this class
var vm = {
game: ko.observableArray([]),
save: function () {
dataservice.saveChanges();
},
reset: function () { dataservice.reset(getAllGames) },
};
在视图模型的顶部,这将在一个数组中返回我的每个游戏。一切正常。“游戏”具有相关数据,该数据返回一个名为“Sets”的数组,其中包含“ourscore”和“theirscore”作为属性。
在我的 html 页面上,我想绑定作为“游戏”实体的一部分返回的具体数据库属性,但我还想为每个游戏创建一个“结果”属性,该属性是基于循环每个设置分数的 javascript 函数计算的,并且相应地返回值。
我尝试在微风“Todo”解决方案中使用布局,并立即在上面的代码下进行设置:
initVm();
function initVm() {
addComputeds();
}
function addComputeds() {
vm.result = ko.computed(function () {
var ourSets = getResult().ourSets;
var theirSets = getResult().theirSets;
if (ourSets == 0 && theirSets == 0) {
return "No Result";
}
return (ourSets > theirSets ? "Won " : "Lost ") + "<b>" + ourSets.toString + "</b>-" + theirSets.ToString;
});
}
function getResult() {
var ourSets = 0;
var theirSets = 0;
vm.game().forEach(function (game) {
for (var gs in game.Sets) {
if (gs.ourScore > gs.theirScore) {
ourSets +=1;
}
else {
theirSets +=1;
}
}
});
return {
ourSets: ourSets,
theirSets: theirSets
};
}
但在我看来,好像它会为视图模型(vm)而不是每个游戏实体添加一个“结果”?此外,当我运行代码时,它不会出错,但它不会在我能看到的任何地方创建“结果”属性,而且似乎无法正常工作。
当我在这里添加它时再次查看它,我可以看到它是错误的,因为它需要处理每个特定的游戏实体来计算每个结果而不是游戏数组(所以我需要 vm.games.result 中的东西而不是vm.result),但我对此太陌生,无法理解如何处理每个单独的游戏实体。我的 .net 编码大脑会让我将循环中的每个游戏实体传递给一个函数以返回该游戏的结果,但我不知道它是否也适用于微风/淘汰赛。
我到处搜索,但我似乎无法找到符合我要求的相关示例,所以非常感谢一些指点!
@BeaverProj
我有一个 main.js 文件,其中发生了这种情况:
(function (root) {
var app = root.app;
app.logger.info('Please wait... data loading');
ko.applyBindings(app.gameViewModel, $("content").get(0));
$(".view").css({ display: 'block' });
}(window));
现在已将顶部部分编辑为:
var vm = {
game: ko.observableArray([]),
save: function () {
dataservice.saveChanges();
},
reset: function () { dataservice.reset(getAllGames) },
result: ko.computed(function () {
var gameRes = getResult();
var ourSets = gameRes.ourSets;
var theirSets = gameRes.theirSets;
if (ourSets == 0 && theirSets == 0) {
return "No Result";
}
return (ourSets > theirSets ? "Won " : "Lost ") + "<b>" + ourSets + "</b>-" + theirSets;
})
};
"getResult" 现在引用 "app.gameViewModel.game().forEach(function (Game) {" 而不是 "vm..."
和以前一样 - 没有错误,但也没有结果。我仍然得到“游戏”的数组,但没有别的。上面的视图模型对我来说仍然是错误的......“结果”应该附加到游戏实体(vm.game)而不是 vm - 目前这将给出 vm.result 并且每个游戏都有一个结果(所以 vm. game.result),而不是每个游戏数组。这就是为什么我想知道是否需要通过微风扩展实体。我可以在普通的 javascript 中做到这一点,但似乎微风或淘汰赛应该能够更容易做到这一点?