Я работаю над веб-приложением MVC, используя шаблон MVVM, breeze.js и Knockout.js. Я впервые использую эти js-библиотеки, и мне еще предстоит понять, как они работают.
На одной из страниц приложения есть сетка, в которой столбцы и строки генерируются динамически. Мне нужно добавить дополнительный столбец, где для каждой строки у меня есть общее количество значений, отображаемых в следующих ячейках строки. Вот пример:
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>
I have been trying to add the Total property by extending the breeze entity object in the following way:
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 и добавляет значения. Я безрезультатно копался в разных версиях этого кода. Кто-нибудь может подсказать, что не так с этим кодом?
FactValues
.FactValues
- это массив. Это всегда один и тот же массив, даже если содержимое массива изменяется. Я просто предполагаю, как я сказал. Если моя догадка верна, есть путь вперед … путем прослушивания изменений в массиве (добавления/удаления) и запуска обновления вычислений, когда значения приходят или уходят. Вы можете попробовать это. В данный момент я завален, но если кто-то не решил это за день или около того, я отдам ему любовь. - person Ward   schedule 15.12.2012