如何计算在网格中总有breeze.js扩展实体?(How to calculate a total

2019-10-17 12:18发布

我正在使用MVVM模式,breeze.js和knockout.js的MVC Web应用程序。 这是我第一次使用这些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,评论,会员,道达尔,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>

我一直在试图通过扩展下列方式微风实体对象添加的总资产:

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);

从本质上讲,这是什么代码是应该做的是加入了淘汰赛计算观察到的命名与总递延评估延长实体。 通过观察到的微风阵列FactValues函数迭代,并增加了的值。 我一直在摆弄不同版本的代码都无济于事。 任何人都可以给我什么是错的这个代码的提示?

Answer 1:

更新:

我们无法得到张贴在我以前的帖子的代码工作。 我们最终得以通过使用自定义与微风结合攻克的难题。 下面是代码:

   ko.bindingHandlers.getFyTotal = {
   update: function (element, valueAccessor) {
       var sum = 0;
       var fact = valueAccessor();
       if (fact.FactValues()) {
           fact.FactValues().forEach(function (fv) {
               sum += parseFloat(fv.Value());
           });
       }

       $(element).html(sum);
   }
};

自定义绑定的HTML代码如下方式则引用:

<td data-bind="getFyTotal: $data" />

希望这可以帮助别人。

经过修改的版本:

我们更新了上面的代码,以利用ko.utils功能:

ko.bindingHandlers.getFyTotal = {
update: function (element, valueAccessor) {
    var sum = 0;
    var fact = valueAccessor();
    if (fact.FactValues()) {
        ko.utils.arrayForEach(fact.FactValues(), function (fv) {
            sum += parseFloat(fv.Value());
        });
    }

    $(element).html(sum);
  }
};


Answer 2:

我模仿你的代码微风之外,它的工作:

http://jsfiddle.net/DazWilkin/yGZ7g/7/

我做了加入你的构造函数FactValues参考(observableArray)克服什么样的一个小调整 - 我相信 - 就是循环/这个问题在JavaScript中。

但是,我还没有在微风尝试这样做,希望做类似的事情。 我无法获得类似功能的工作,最终,我的executeQuery的“然后”处理过程中产生的总计:

...manager.executeQuery(....).then(function(data) {
   ...
   Fact.Total(FactValues()
      .map(function(fv){ return fv.Value(); })
      .reduce(function (total,curr) { return total+curr; });
   ...
}

我会努力找回我的版本今天的工作,如果我找到一个更好的解决办法,我马上汇报。



文章来源: How to calculate a total in a grid with breeze.js extended entities?