私はMVVMパターンbreeze.jsとknockout.jsを使用してMVCWebアプリケーションに取り組んでいます。これらのjsライブラリを使用するのはこれが初めてですが、それでもそれらがどのように機能するかを把握する必要があります。
アプリケーションのページの1つには、列と行の両方が動的に生成されるグリッドがあります。列を追加する必要があります。各行について、次の行のセルに値の合計が表示されます。ここに例があります:
Data type | Comment | Fact 1 | Fact 2 | Total | Value 1 | Value 2 | Value 3 | Value 4
==============================================================================================
Item 1 | any comment | fact 1 | fact 2 | calc. sum | 10 | 20 | 30 | 40
グリッドは、そよ風のエンティティオブジェクト(planningItems)をテンプレートにバインドすることによって生成されます。オブジェクトには、DataTypeId、Comment、Member、Total、FactValuesのプロパティがあります。合計は計算された合計です。
<script type="text/html" id="list-planning-template">
<tr data-bind="mouseOverButton: $data">
<td style="text-align: center">
<button class="actionbutton actionbutton-item" data-bind="selectItem: $root.selectedItems, itemId: FactId"></button>
</td>
<td data-bind="text: DataTypeId" />
<td data-bind="text: Comment().Text" />
<!-- ko foreach: FactMembers -->
<td data-bind="text: Member().Code"></td>
<!-- /ko -->
<td data-bind="text: Total" />
<!-- ko foreach: FactValues -->
<td style="width: 50px" data-bind="text: Value"></td>
<!-- /ko -->
</tr>
次のようにbreezeエンティティオブジェクトを拡張して、Totalプロパティを追加しようとしています。
var FactCtor = function () {
this.Total = ko.computed({
read: function () {
var sum = 0;
if (this.FactValues) {
this.FactValues().forEach(function (fv) {
sum += fv.Value();
});
}
return sum;
},
deferEvaluation: true
}, this);
};
manager.metadataStore.registerEntityTypeCtor("Fact", FactCtor);
基本的に、このコードが行うことになっているのは、評価が延期されたTotalという名前のノックアウト計算されたオブザーバブルを追加することによってエンティティを拡張することです。この関数は、そよ風の観測可能な配列FactValuesを反復処理し、値を追加します。私はこのコードのさまざまなバージョンをいじくり回していて無駄にしています。誰かがこのコードの何が問題になっているのかについてのヒントを教えてもらえますか?