これを行う方法について頭を悩ませることはできません。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) },
};
ビューモデルの上部にあり、これにより、各ゲームが配列で返されます。すべて正常に動作します。「Games」には、プロパティとして「ourscore」と「irscore」を含む「Sets」という配列を返す関連データがあります。
私の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.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」は、「vm...」ではなく「app.gameViewModel.game().forEach(function (Game) {」を参照するようになりました
前と同じ - エラーはありませんが、結果もありません。私はまだ「ゲーム」の配列を取得していますが、他には何もありません。上記のビューモデルはまだ私には間違っているようです...「結果」はvmではなくゲームエンティティ(vm.game)に添付する必要があります-現在、これはvm.resultを提供し、ゲームごとに結果があります(したがってvm. game.result)、ゲームの配列ごとではありません。これが、そよ風を介してエンティティを拡張する必要があるかどうか疑問に思っている理由です。私は通常の JavaScript でこれを行うことができますが、そよ風またはノックアウトはこれをはるかに簡単に行うことができるように思われますか?